diff --git a/django/contrib/syndication/views.py b/django/contrib/syndication/views.py index 68ffb0bfe0..df97103318 100644 --- a/django/contrib/syndication/views.py +++ b/django/contrib/syndication/views.py @@ -212,6 +212,7 @@ class Feed: author_name=author_name, author_email=author_email, author_link=author_link, + comments=self._get_dynamic_attr('item_comments', item), categories=self._get_dynamic_attr('item_categories', item), item_copyright=self._get_dynamic_attr('item_copyright', item), **self.item_extra_kwargs(item) diff --git a/docs/ref/contrib/syndication.txt b/docs/ref/contrib/syndication.txt index 13aa944e8a..e9063d0629 100644 --- a/docs/ref/contrib/syndication.txt +++ b/docs/ref/contrib/syndication.txt @@ -889,6 +889,27 @@ This example illustrates all possible attributes and methods for a item_copyright = 'Copyright (c) 2007, Sally Smith' # Hard-coded copyright notice. + # ITEM COMMENTS URL -- It's optional to use one of these three. This is + # a hook that specifies how to get the URL of a page for comments for a + # given item. + + def item_comments(self, obj): + """ + Takes an item, as returned by items(), and returns the item's + comments URL as a normal Python string. + """ + + def item_comments(self): + """ + Returns the comments URL for every item in the feed. + """ + + item_comments = 'https://www.example.com/comments' # Hard-coded comments URL + +.. versionchanged:: 3.2 + + Support for a comments URL per feed item was added through the + ``item_comments`` hook. The low-level framework ======================= diff --git a/docs/releases/3.2.txt b/docs/releases/3.2.txt index 129026cf89..ada68addea 100644 --- a/docs/releases/3.2.txt +++ b/docs/releases/3.2.txt @@ -144,7 +144,8 @@ Minor features :mod:`django.contrib.syndication` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* ... +* The new ``item_comments`` hook allows specifying a comments URL per feed + item. Cache ~~~~~ diff --git a/tests/syndication_tests/feeds.py b/tests/syndication_tests/feeds.py index 4e9b1170b1..adc3b2e56c 100644 --- a/tests/syndication_tests/feeds.py +++ b/tests/syndication_tests/feeds.py @@ -29,6 +29,9 @@ class TestRss2Feed(views.Feed): def item_updateddate(self, item): return item.updated + def item_comments(self, item): + return "%scomments" % item.get_absolute_url() + item_author_name = 'Sally Smith' item_author_email = 'test@example.com' item_author_link = 'http://www.example.com/' diff --git a/tests/syndication_tests/tests.py b/tests/syndication_tests/tests.py index dab7ebab33..d9456ed618 100644 --- a/tests/syndication_tests/tests.py +++ b/tests/syndication_tests/tests.py @@ -136,10 +136,20 @@ class SyndicationFeedTest(FeedTestCase): 'guid': 'http://example.com/blog/1/', 'pubDate': pub_date, 'author': 'test@example.com (Sally Smith)', + 'comments': '/blog/1/comments', }) self.assertCategories(items[0], ['python', 'testing']) for item in items: - self.assertChildNodes(item, ['title', 'link', 'description', 'guid', 'category', 'pubDate', 'author']) + self.assertChildNodes(item, [ + 'title', + 'link', + 'description', + 'guid', + 'category', + 'pubDate', + 'author', + 'comments', + ]) # Assert that does not have any 'isPermaLink' attribute self.assertIsNone(item.getElementsByTagName( 'guid')[0].attributes.get('isPermaLink'))