Improved syndication feed framework to use RequestSite if the sites framework is not installed -- i.e., the sites framework is no longer required to use the syndication feed framework. This is backwards incompatible if anybody has subclassed Feed and overridden __init__(), because the second parameter is now expected to be an HttpRequest object instead of request.path

git-svn-id: http://code.djangoproject.com/svn/django/trunk@5654 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2007-07-12 05:29:32 +00:00
parent dcd5750d7a
commit 090aa5210e
3 changed files with 25 additions and 7 deletions

View File

@ -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
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)

View File

@ -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

View File

@ -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
-----------------