diff --git a/django/contrib/syndication/feeds.py b/django/contrib/syndication/feeds.py index 547afb17f3d..eb5a9f0607c 100644 --- a/django/contrib/syndication/feeds.py +++ b/django/contrib/syndication/feeds.py @@ -1,6 +1,6 @@ from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist from django.template import Context, loader, Template, TemplateDoesNotExist -from django.contrib.sites.models import Site +from django.contrib.sites.models import Site, RequestSite from django.utils import feedgenerator from django.utils.encoding import smart_unicode, iri_to_uri from django.conf import settings @@ -22,9 +22,10 @@ class Feed(object): title_template = None description_template = None - def __init__(self, slug, feed_url): + def __init__(self, slug, request): self.slug = slug - self.feed_url = feed_url + self.request = request + self.feed_url = request.path self.title_template_name = self.title_template or ('feeds/%s_title.html' % slug) self.description_template_name = self.description_template or ('feeds/%s_description.html' % slug) @@ -67,7 +68,11 @@ class Feed(object): else: obj = None - current_site = Site.objects.get_current() + if Site._meta.installed: + current_site = Site.objects.get_current() + else: + current_site = RequestSite(self.request) + link = self.__get_dynamic_attr('link', obj) link = add_domain(current_site.domain, link) diff --git a/django/contrib/syndication/views.py b/django/contrib/syndication/views.py index 621665d4d42..423d333991d 100644 --- a/django/contrib/syndication/views.py +++ b/django/contrib/syndication/views.py @@ -16,7 +16,7 @@ def feed(request, url, feed_dict=None): raise Http404, "Slug %r isn't registered." % slug try: - feedgen = f(slug, request.path).get_feed(param) + feedgen = f(slug, request).get_feed(param) except feeds.FeedDoesNotExist: raise Http404, "Invalid feed parameters. Slug %r is valid, but other parameters, or lack thereof, are not." % slug diff --git a/docs/syndication_feeds.txt b/docs/syndication_feeds.txt index fe70f2ae7de..393572f3e21 100644 --- a/docs/syndication_feeds.txt +++ b/docs/syndication_feeds.txt @@ -31,6 +31,12 @@ To create a feed, just write a ``Feed`` class and point to it in your URLconf_. Initialization -------------- +If you're not using the latest Django development version, you'll need to make +sure Django's sites framework is installed -- including its database table. +(See the `sites framework documentation`_ for more information.) This has +changed in the Django development version; the syndication feed framework no +longer requires the sites framework. + To activate syndication feeds on your Django site, add this line to your URLconf_:: @@ -72,6 +78,7 @@ The above example registers two feeds: Once that's set up, you just need to define the ``Feed`` classes themselves. +.. _sites framework documentation: ../sites/ .. _URLconf: ../url_dispatch/ .. _settings file: ../settings/ @@ -131,9 +138,14 @@ put into those elements. * ``{{ obj }}`` -- The current object (one of whichever objects you returned in ``items()``). - * ``{{ site }}`` -- A ``django.models.core.sites.Site`` object + * ``{{ site }}`` -- A ``django.contrib.sites.models.Site`` object representing the current site. This is useful for - ``{{ site.domain }}`` or ``{{ site.name }}``. + ``{{ site.domain }}`` or ``{{ site.name }}``. Note that if you're + using the latest Django development version and do *not* have the + Django sites framework installed, this will be set to a + ``django.contrib.sites.models.RequestSite`` object. See the + `RequestSite section of the sites framework documentation`_ for + more. If you don't create a template for either the title or description, the framework will use the template ``"{{ obj }}"`` by default -- that is, @@ -164,6 +176,7 @@ put into those elements. .. _chicagocrime.org: http://www.chicagocrime.org/ .. _object-relational mapper: ../db-api/ .. _Django templates: ../templates/ +.. _RequestSite section of the sites framework documentation: ../sites/#requestsite-objects A complex example -----------------