Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 774885
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 14, 20262026-05-14T19:12:07+00:00 2026-05-14T19:12:07+00:00

I’m using the Django Feeds Framework and it’s really nice, very intuitive and easy

  • 0

I’m using the Django Feeds Framework and it’s really nice, very intuitive and easy to use. But, I think there is a problem when creating links to feeds in HTML.

For example:

<link rel="alternate" type="application/rss+xml" title="{{ feed_title }}" href="{{ url_of_feed }}" />

Link’s HREF attribute can be easily found out, just use reverse()

But, what about the TITLE attribute? Where the template engine should look for this? Even more, what if the feed is build up dinamically and the title depends on parameters (like this)?

I can’t come up with a solution that “seems” DRY to me… All that I can come up with is using context processors o template tags, but it gets messy when the context procesor/template tag has to find parameters to construct the Feed class, and writing this I realize I don’t even know how to create a Feed instance myself within the view.

If I put all this logic in the view, it would not be just one view. Also, the value for TITLE would be in the view AND in the feed.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-14T19:12:08+00:00Added an answer on May 14, 2026 at 7:12 pm

    I’m not fully satisfied with this solution, it may break feeds using Request and depends on a magic method. There it goes:

    #coding:utf-8
    # Author: Armando Pérez Marqués <mandx@rbol.org>
    # Purpose: Django TemplateTag to output feed links in templates in a DRY way
    # Created: 05/07/2010
    
    import re
    
    from django import template
    from django.conf import settings
    from django.contrib.syndication.views import Feed
    from django.core.urlresolvers import reverse, resolve, NoReverseMatch
    from django.template import Node
    from django.template import TemplateSyntaxError
    from django.utils.encoding import smart_str
    from django.utils.html import escape as html_escape
    from django.utils.safestring import mark_safe
    
    register = template.Library()
    
    kwarg_re = re.compile(r"(?:(\w+)=)?(.+)")
    
    class FeedInfoNode(Node):
        def __init__(self, view_name, args, kwargs, asvar):
            self.view_name = view_name
            self.args = args
            self.kwargs = kwargs
            self.asvar = asvar
    
        def render(self, context):
            args = [arg.resolve(context) for arg in self.args]
            kwargs = dict([(smart_str(k,'ascii'), v.resolve(context))
                           for k, v in self.kwargs.items()])
    
            # Try to look up the URL twice: once given the view name, and again
            # relative to what we guess is the "main" app. If they both fail,
            # re-raise the NoReverseMatch unless we're using the
            # {% feed_info ... as var %} construct in which cause return nothing.
            url = ''
            try:
                url = reverse(self.view_name, args=args, kwargs=kwargs, current_app=context.current_app)
            except NoReverseMatch, e:
                if settings.SETTINGS_MODULE:
                    project_name = settings.SETTINGS_MODULE.split('.')[0]
                    try:
                        url = reverse(project_name + '.' + self.view_name,
                                  args=args, kwargs=kwargs, current_app=context.current_app)
                    except NoReverseMatch:
                        if self.asvar is None:
                            # Re-raise the original exception, not the one with
                            # the path relative to the project. This makes a
                            # better error message.
                            raise e
                else:
                    if self.asvar is None:
                        raise e
    
            if 'request' in context:
                request = context['request']
            else:
                request = None
    
            feed_instance, feed_args, feed_kwargs = resolve(url)
            if not isinstance(feed_instance, Feed):
                raise NoReverseMatch, \
                      'feed_info can only reverse class-based feeds'
    
            feed_obj = feed_instance.get_object(request, *feed_args, **feed_kwargs)
    
            feed_data = {
                'url': url,
                'obj': feed_instance,
                'args': feed_args,
                'kwargs': feed_kwargs,
                #'title': html_escape(feed_instance.__get_dynamic_attr('title', obj)),
                'title': html_escape(
                    feed_instance._Feed__get_dynamic_attr('title', feed_obj)
                    ),
                'type': feed_instance.feed_type.mime_type,
            }
    
            if self.asvar:
                context[self.asvar] = feed_data
                return ''
            else:
                return mark_safe(
                    '<link rel="alternate" type="%(type)s" title="%(title)s" href="%(url)s" />' \
                    % feed_data
                )
    
    def feed_info(parser, token):
        """
        Returns an mapping containing populated info about the reversed feed
        Works exactly as the url tag, but the mapping is not returned, instead
        a variable is always set  in the context.
    
        This is a way to define links that aren't tied to a particular URL
        configuration::
    
            {% feed_info path.to.some_feed_view_class arg1 arg2 as feed_info_var %}
    
            or
    
            {% feed_info path.to.some_feed_view_class name1=value1 name2=value2 as feed_info_var %}
        """
    
        bits = token.split_contents()
        if len(bits) < 2:
            raise TemplateSyntaxError("'%s' takes at least one argument"
                                      " (path to a feed view)" % bits[0])
        viewname = bits[1]
        args = []
        kwargs = {}
        asvar = None
        bits = bits[2:]
        if len(bits) >= 2 and bits[-2] == 'as':
            asvar = bits[-1]
            bits = bits[:-2]
    
        # Backwards compatibility: check for the old comma separated format
        # {% url urlname arg1,arg2 %}
        # Initial check - that the first space separated bit has a comma in it
        if bits and ',' in bits[0]:
            check_old_format = True
            # In order to *really* be old format, there must be a comma
            # in *every* space separated bit, except the last.
            for bit in bits[1:-1]:
                if ',' not in bit:
                    # No comma in this bit. Either the comma we found
                    # in bit 1 was a false positive (e.g., comma in a string),
                    # or there is a syntax problem with missing commas
                    check_old_format = False
                    break
        else:
            # No comma found - must be new format.
            check_old_format = False
    
        if check_old_format:
            # Confirm that this is old format by trying to parse the first
            # argument. An exception will be raised if the comma is
            # unexpected (i.e. outside of a static string).
            match = kwarg_re.match(bits[0])
            if match:
                value = match.groups()[1]
                try:
                    parser.compile_filter(value)
                except TemplateSyntaxError:
                    bits = ''.join(bits).split(',')
    
        # Now all the bits are parsed into new format,
        # process them as template vars
        if len(bits):
            for bit in bits:
                match = kwarg_re.match(bit)
                if not match:
                    raise TemplateSyntaxError("Malformed arguments to url tag")
                name, value = match.groups()
                if name:
                    kwargs[name] = parser.compile_filter(value)
                else:
                    args.append(parser.compile_filter(value))
    
        return FeedInfoNode(viewname, args, kwargs, asvar)
    
    feed_info = register.tag(feed_info)
    

    I’m starting with the code of the {% url %} template tag, and then, after obtaining the feed’s URL, use resolve() to get the Feed subclass instance, and then get the needed attributes.

    Caveats

    • Requires Django 1.2 Class Feeds, don’t know exactly how to do this with the old way of feeds.
    • If the feed class uses the request object, the request context processor must be configured, since None is passed if it isn’t present in the context.
    • There’s an oddity with Feed.__get_dynamic_attr(). The Feed subclass instance doesn’t have this method; instead, it appears with another name. Don’t know how to figure the name out at runtime…
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 408k
  • Answers 408k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer <ListBox Margin="44,54,134,0" Name="listView1" Height="64" HorizontalContentAlignment="Stretch"> <Button Height="20"></Button> <Button Height="20"></Button> </ListBox>… May 15, 2026 at 6:49 am
  • Editorial Team
    Editorial Team added an answer Maybe the following: mysqld --help --verbose | grep datadir May 15, 2026 at 6:49 am
  • Editorial Team
    Editorial Team added an answer First of all, I think you should rethink your strategy.… May 15, 2026 at 6:49 am

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.