{"title":"The syndication feed framework","version":"1.8","locale":"en","docname":"ref/contrib/syndication","url":"/en/1.8/ref/contrib/syndication/","canonical":"https://djangodocs.dev/en/1.8/ref/contrib/syndication/","summary":"Django comes with a high-level syndication-feed-generating framework that makes creating RSS and Atom feeds easy. To create any syndication feed, all you have to do…","html":"<span id=\"the-syndication-feed-framework\"></span><h1>The syndication feed framework<a class=\"heading-anchor\" href=\"#module-django.contrib.syndication\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django comes with a high-level syndication-feed-generating framework\nthat makes creating <a class=\"reference external\" href=\"http://www.whatisrss.com/\">RSS</a> and <a class=\"reference external\" href=\"http://tools.ietf.org/html/rfc4287\">Atom</a> feeds easy.</p>\n<p>To create any syndication feed, all you have to do is write a short\nPython class. You can create as many feeds as you want.</p>\n<p>Django also comes with a lower-level feed-generating API. Use this if\nyou want to generate feeds outside of a Web context, or in some other\nlower-level way.</p>\n<section id=\"the-high-level-framework\">\n<h2>The high-level framework<a class=\"heading-anchor\" href=\"#the-high-level-framework\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"overview\">\n<h3>Overview<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The high-level feed-generating framework is supplied by the\n<a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class. To create a\nfeed, write a <a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class\nand point to an instance of it in your <a class=\"reference internal\" href=\"/en/1.8/topics/http/urls/\"><span class=\"doc\">URLconf</span></a>.</p>\n</section>\n<section id=\"feed-classes\">\n<h3>Feed classes<a class=\"heading-anchor\" href=\"#feed-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A <a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class is a Python\nclass that represents a syndication feed. A feed can be simple (e.g.,\na “site news” feed, or a basic feed displaying the latest entries of a\nblog) or more complex (e.g., a feed displaying all the blog entries in\na particular category, where the category is variable).</p>\n<p>Feed classes subclass <a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.syndication.views.Feed</span></code></a>.\nThey can live anywhere in your codebase.</p>\n<p>Instances of <a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> classes\nare views which can be used in your <a class=\"reference internal\" href=\"/en/1.8/topics/http/urls/\"><span class=\"doc\">URLconf</span></a>.</p>\n</section>\n<section id=\"a-simple-example\">\n<h3>A simple example<a class=\"heading-anchor\" href=\"#a-simple-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>This simple example, taken from a hypothetical police beat news site describes\na feed of the latest five news items:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.syndication.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Feed</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.urlresolvers</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">policebeat.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">NewsItem</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">LatestEntriesFeed</span><span class=\"p\">(</span><span class=\"n\">Feed</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Police beat site news&quot;</span>\n    <span class=\"n\">link</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;/sitenews/&quot;</span>\n    <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Updates on changes and additions to police beat central.&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">items</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">NewsItem</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_title</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">item</span><span class=\"o\">.</span><span class=\"n\">title</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_description</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">item</span><span class=\"o\">.</span><span class=\"n\">description</span>\n\n    <span class=\"c1\"># item_link is only needed if NewsItem has no get_absolute_url method.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s1\">&#39;news-item&#39;</span><span class=\"p\">,</span> <span class=\"n\">args</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"n\">item</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>To connect a URL to this feed, put an instance of the Feed object in\nyour <a class=\"reference internal\" href=\"/en/1.8/topics/http/urls/\"><span class=\"doc\">URLconf</span></a>. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">url</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myproject.feeds</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LatestEntriesFeed</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^latest/feed/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">LatestEntriesFeed</span><span class=\"p\">()),</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Note:</p>\n<ul class=\"simple\">\n<li><p>The Feed class subclasses <a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.syndication.views.Feed</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> correspond to the\nstandard RSS <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;title&gt;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;link&gt;</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;description&gt;</span></code> elements,\nrespectively.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> is, simply, a method that returns a list of objects that\nshould be included in the feed as <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;item&gt;</span></code> elements. Although this\nexample returns <code class=\"docutils literal notranslate\"><span class=\"pre\">NewsItem</span></code> objects using Django’s\n<a class=\"reference internal\" href=\"/en/1.8/ref/models/querysets/\"><span class=\"doc\">object-relational mapper</span></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code>\ndoesn’t have to return model instances. Although you get a few bits of\nfunctionality “for free” by using Django models, <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> can\nreturn any type of object you want.</p></li>\n<li><p>If you’re creating an Atom feed, rather than an RSS feed, set the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code> attribute instead of the <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> attribute.\nSee <a class=\"reference internal\" href=\"#publishing-atom-and-rss-feeds-in-tandem\">Publishing Atom and RSS feeds in tandem</a>, later, for an example.</p></li>\n</ul>\n<p>One thing is left to do. In an RSS feed, each <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;item&gt;</span></code> has a <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;title&gt;</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;link&gt;</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;description&gt;</span></code>. We need to tell the framework what data to put\ninto those elements.</p>\n<ul>\n<li><p>For the contents of <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;title&gt;</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;description&gt;</span></code>, Django tries\ncalling the methods <code class=\"docutils literal notranslate\"><span class=\"pre\">item_title()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">item_description()</span></code> on\nthe <a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class. They are passed\na single parameter, <code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>, which is the object itself. These are\noptional; by default, the unicode representation of the object is used for\nboth.</p>\n<p>If you want to do any special formatting for either the title or\ndescription, <a class=\"reference internal\" href=\"/en/1.8/ref/templates/language/\"><span class=\"doc\">Django templates</span></a> can be used\ninstead. Their paths can be specified with the <code class=\"docutils literal notranslate\"><span class=\"pre\">title_template</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">description_template</span></code> attributes on the\n<a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class. The templates are\nrendered for each item and are passed two template context variables:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">obj</span> <span class=\"pre\">}}</span></code> – The current object (one of whichever objects you\nreturned in <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code>).</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site</span> <span class=\"pre\">}}</span></code> – A <a class=\"reference internal\" href=\"/en/1.8/ref/contrib/sites/#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.sites.models.Site</span></code></a> object\nrepresenting the current site. This is useful for <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site.domain</span>\n<span class=\"pre\">}}</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site.name</span> <span class=\"pre\">}}</span></code>. If you do <em>not</em> have the Django sites\nframework installed, this will be set to a\n<a class=\"reference internal\" href=\"/en/1.8/ref/contrib/sites/#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code></a> object. See the\n<a class=\"reference internal\" href=\"/en/1.8/ref/contrib/sites/#id3\"><span class=\"std std-ref\">RequestSite section of the sites framework documentation</span></a> for more.</p></li>\n</ul>\n<p>See <a class=\"reference internal\" href=\"#a-complex-example\">a complex example</a> below that uses a description template.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.syndication.Feed.get_context_data\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Feed.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_context_data</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.syndication.Feed.get_context_data\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>There is also a way to pass additional information to title and description\ntemplates, if you need to supply more than the two variables mentioned\nbefore. You can provide your implementation of <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data</span></code> method\nin your <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code> subclass. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">mysite.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Article</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.syndication.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Feed</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ArticlesFeed</span><span class=\"p\">(</span><span class=\"n\">Feed</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;My articles&quot;</span>\n    <span class=\"n\">description_template</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;feeds/articles.html&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">items</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_context_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">ArticlesFeed</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">get_context_data</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n        <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;bar&#39;</span>\n        <span class=\"k\">return</span> <span class=\"n\">context</span>\n</code></pre></div>\n</dd></dl>\n\n<p>And the template:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Something about <span class=\"cp\">{{</span> <span class=\"nv\">foo</span> <span class=\"cp\">}}</span>: <span class=\"cp\">{{</span> <span class=\"nv\">obj.description</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>This method will be called once per each item in the list returned by\n<code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> with the following keyword arguments:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>: the current item. For backward compatibility reasons, the name\nof this context variable is <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">obj</span> <span class=\"pre\">}}</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code>: the object returned by <code class=\"docutils literal notranslate\"><span class=\"pre\">get_object()</span></code>. By default this is not\nexposed to the templates to avoid confusion with <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">obj</span> <span class=\"pre\">}}</span></code> (see above),\nbut you can use it in your implementation of <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data()</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code>: current site as described above.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>: current request.</p></li>\n</ul>\n<p>The behavior of <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data()</span></code> mimics that of\n<a class=\"reference internal\" href=\"/en/1.8/topics/class-based-views/generic-display/#adding-extra-context\"><span class=\"std std-ref\">generic views</span></a> - you’re supposed to call\n<code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code> to retrieve context data from parent class, add your data\nand return the modified dictionary.</p>\n</li>\n<li><p>To specify the contents of <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;link&gt;</span></code>, you have two options. For each item\nin <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code>, Django first tries calling the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">item_link()</span></code> method on the\n<a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class. In a similar way to\nthe title and description, it is passed it a single parameter,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>. If that method doesn’t exist, Django tries executing a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> method on that object. Both\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">item_link()</span></code> should return the\nitem’s URL as a normal Python string. As with <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code>, the\nresult of <code class=\"docutils literal notranslate\"><span class=\"pre\">item_link()</span></code> will be included directly in the URL, so you\nare responsible for doing all necessary URL quoting and conversion to\nASCII inside the method itself.</p></li>\n</ul>\n</section>\n<section id=\"a-complex-example\">\n<h3>A complex example<a class=\"heading-anchor\" href=\"#a-complex-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The framework also supports more complex feeds, via arguments.</p>\n<p>For example, a website could offer an RSS feed of recent crimes for every\npolice beat in a city. It’d be silly to create a separate\n<a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class for each police beat; that\nwould violate the <a class=\"reference internal\" href=\"/en/1.8/misc/design-philosophies/#dry\"><span class=\"std std-ref\">DRY principle</span></a> and would couple data to\nprogramming logic. Instead, the syndication framework lets you access the\narguments passed from your <a class=\"reference internal\" href=\"/en/1.8/topics/http/urls/\"><span class=\"doc\">URLconf</span></a> so feeds can output\nitems based on information in the feed’s URL.</p>\n<p>The police beat feeds could be accessible via URLs like this:</p>\n<ul class=\"simple\">\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">/beats/613/rss/</span></code> – Returns recent crimes for beat 613.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">/beats/1424/rss/</span></code> – Returns recent crimes for beat 1424.</p></li>\n</ul>\n<p>These can be matched with a <a class=\"reference internal\" href=\"/en/1.8/topics/http/urls/\"><span class=\"doc\">URLconf</span></a> line such as:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^beats/(?P&lt;beat_id&gt;[0-9]+)/rss/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">BeatFeed</span><span class=\"p\">()),</span>\n</code></pre></div>\n<p>Like a view, the arguments in the URL are passed to the <code class=\"docutils literal notranslate\"><span class=\"pre\">get_object()</span></code>\nmethod along with the request object.</p>\n<p>Here’s the code for these beat-specific feeds:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.syndication.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Feed</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BeatFeed</span><span class=\"p\">(</span><span class=\"n\">Feed</span><span class=\"p\">):</span>\n    <span class=\"n\">description_template</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;feeds/beat_description.html&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_object</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">beat_id</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">Beat</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">beat_id</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">title</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;Police beat central: Crimes for beat </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">beat</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">get_absolute_url</span><span class=\"p\">()</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">description</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;Crimes recently reported in police beat </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">beat</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">items</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">Crime</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">beat</span><span class=\"o\">=</span><span class=\"n\">obj</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-crime_date&#39;</span><span class=\"p\">)[:</span><span class=\"mi\">30</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>To generate the feed’s <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;title&gt;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;link&gt;</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;description&gt;</span></code>, Django\nuses the <code class=\"docutils literal notranslate\"><span class=\"pre\">title()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">link()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">description()</span></code> methods. In\nthe previous example, they were simple string class attributes, but this example\nillustrates that they can be either strings <em>or</em> methods. For each of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code>, Django follows this\nalgorithm:</p>\n<ul class=\"simple\">\n<li><p>First, it tries to call a method, passing the <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> argument, where\n<code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> is the object returned by <code class=\"docutils literal notranslate\"><span class=\"pre\">get_object()</span></code>.</p></li>\n<li><p>Failing that, it tries to call a method with no arguments.</p></li>\n<li><p>Failing that, it uses the class attribute.</p></li>\n</ul>\n<p>Also note that <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> also follows the same algorithm – first, it\ntries <code class=\"docutils literal notranslate\"><span class=\"pre\">items(obj)</span></code>, then <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code>, then finally an <code class=\"docutils literal notranslate\"><span class=\"pre\">items</span></code>\nclass attribute (which should be a list).</p>\n<p>We are using a template for the item descriptions. It can be very simple:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">obj.description</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>However, you are free to add formatting as desired.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">ExampleFeed</span></code> class below gives full documentation on methods and\nattributes of <a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> classes.</p>\n</section>\n<section id=\"specifying-the-type-of-feed\">\n<h3>Specifying the type of feed<a class=\"heading-anchor\" href=\"#specifying-the-type-of-feed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>By default, feeds produced in this framework use RSS 2.0.</p>\n<p>To change that, add a <code class=\"docutils literal notranslate\"><span class=\"pre\">feed_type</span></code> attribute to your\n<a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class, like so:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.feedgenerator</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Atom1Feed</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyFeed</span><span class=\"p\">(</span><span class=\"n\">Feed</span><span class=\"p\">):</span>\n    <span class=\"n\">feed_type</span> <span class=\"o\">=</span> <span class=\"n\">Atom1Feed</span>\n</code></pre></div>\n<p>Note that you set <code class=\"docutils literal notranslate\"><span class=\"pre\">feed_type</span></code> to a class object, not an instance.</p>\n<p>Currently available feed types are:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.Rss201rev2Feed\" title=\"django.utils.feedgenerator.Rss201rev2Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.utils.feedgenerator.Rss201rev2Feed</span></code></a> (RSS 2.01. Default.)</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.RssUserland091Feed\" title=\"django.utils.feedgenerator.RssUserland091Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.utils.feedgenerator.RssUserland091Feed</span></code></a> (RSS 0.91.)</p></li>\n<li><p><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.Atom1Feed\" title=\"django.utils.feedgenerator.Atom1Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.utils.feedgenerator.Atom1Feed</span></code></a> (Atom 1.0.)</p></li>\n</ul>\n</section>\n<section id=\"enclosures\">\n<h3>Enclosures<a class=\"heading-anchor\" href=\"#enclosures\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To specify enclosures, such as those used in creating podcast feeds, use the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">item_enclosure_url</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">item_enclosure_length</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">item_enclosure_mime_type</span></code> hooks. See the <code class=\"docutils literal notranslate\"><span class=\"pre\">ExampleFeed</span></code> class below for\nusage examples.</p>\n</section>\n<section id=\"language\">\n<h3>Language<a class=\"heading-anchor\" href=\"#language\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Feeds created by the syndication framework automatically include the\nappropriate <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;language&gt;</span></code> tag (RSS 2.0) or <code class=\"docutils literal notranslate\"><span class=\"pre\">xml:lang</span></code> attribute (Atom). This\ncomes directly from your <a class=\"reference internal\" href=\"/en/1.8/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> setting.</p>\n</section>\n<section id=\"urls\">\n<h3>URLs<a class=\"heading-anchor\" href=\"#urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code> method/attribute can return either an absolute path (e.g.\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">&quot;/blog/&quot;</span></code>) or a URL with the fully-qualified domain and protocol (e.g.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;http://www.example.com/blog/&quot;</span></code>). If <code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code> doesn’t return the domain,\nthe syndication framework will insert the domain of the current site, according\nto your <a class=\"reference internal\" href=\"/en/1.8/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span> <span class=\"pre\">setting</span></code></a>.</p>\n<p>Atom feeds require a <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;link</span> <span class=\"pre\">rel=&quot;self&quot;&gt;</span></code> that defines the feed’s current\nlocation. The syndication framework populates this automatically, using the\ndomain of the current site according to the <a class=\"reference internal\" href=\"/en/1.8/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting.</p>\n</section>\n<section id=\"publishing-atom-and-rss-feeds-in-tandem\">\n<h3>Publishing Atom and RSS feeds in tandem<a class=\"heading-anchor\" href=\"#publishing-atom-and-rss-feeds-in-tandem\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Some developers like to make available both Atom <em>and</em> RSS versions of their\nfeeds. That’s easy to do with Django: Just create a subclass of your\n<a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a>\nclass and set the <code class=\"docutils literal notranslate\"><span class=\"pre\">feed_type</span></code> to something different. Then update your\nURLconf to add the extra versions.</p>\n<p>Here’s a full example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.syndication.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Feed</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">policebeat.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">NewsItem</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.feedgenerator</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Atom1Feed</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RssSiteNewsFeed</span><span class=\"p\">(</span><span class=\"n\">Feed</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Police beat site news&quot;</span>\n    <span class=\"n\">link</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;/sitenews/&quot;</span>\n    <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Updates on changes and additions to police beat central.&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">items</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">NewsItem</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-pub_date&#39;</span><span class=\"p\">)[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AtomSiteNewsFeed</span><span class=\"p\">(</span><span class=\"n\">RssSiteNewsFeed</span><span class=\"p\">):</span>\n    <span class=\"n\">feed_type</span> <span class=\"o\">=</span> <span class=\"n\">Atom1Feed</span>\n    <span class=\"n\">subtitle</span> <span class=\"o\">=</span> <span class=\"n\">RssSiteNewsFeed</span><span class=\"o\">.</span><span class=\"n\">description</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>In this example, the RSS feed uses a <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> while the Atom\nfeed uses a <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code>. That’s because Atom feeds don’t provide for\na feed-level “description,” but they <em>do</em> provide for a “subtitle.”</p>\n<p>If you provide a <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> in your\n<a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class, Django will <em>not</em>\nautomatically put that into the <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code> element, because a\nsubtitle and description are not necessarily the same thing. Instead, you\nshould define a <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code> attribute.</p>\n<p>In the above example, we simply set the Atom feed’s <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code> to the\nRSS feed’s <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code>, because it’s quite short already.</p>\n</aside>\n<p>And the accompanying URLconf:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">url</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myproject.feeds</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RssSiteNewsFeed</span><span class=\"p\">,</span> <span class=\"n\">AtomSiteNewsFeed</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^sitenews/rss/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">RssSiteNewsFeed</span><span class=\"p\">()),</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^sitenews/atom/$&#39;</span><span class=\"p\">,</span> <span class=\"n\">AtomSiteNewsFeed</span><span class=\"p\">()),</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</section>\n<section id=\"feed-class-reference\">\n<h3>Feed class reference<a class=\"heading-anchor\" href=\"#feed-class-reference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.syndication.views.Feed\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">views.</span></span><span class=\"sig-name descname\"><span class=\"pre\">Feed</span></span><a class=\"heading-anchor\" href=\"#django.contrib.syndication.views.Feed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>This example illustrates all possible attributes and methods for a\n<a class=\"reference internal\" href=\"#django.contrib.syndication.views.Feed\" title=\"django.contrib.syndication.views.Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Feed</span></code></a> class:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.syndication.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Feed</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">feedgenerator</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ExampleFeed</span><span class=\"p\">(</span><span class=\"n\">Feed</span><span class=\"p\">):</span>\n\n    <span class=\"c1\"># FEED TYPE -- Optional. This should be a class that subclasses</span>\n    <span class=\"c1\"># django.utils.feedgenerator.SyndicationFeed. This designates</span>\n    <span class=\"c1\"># which type of feed this should be: RSS 2.0, Atom 1.0, etc. If</span>\n    <span class=\"c1\"># you don&#39;t specify feed_type, your feed will be RSS 2.0. This</span>\n    <span class=\"c1\"># should be a class, not an instance of the class.</span>\n\n    <span class=\"n\">feed_type</span> <span class=\"o\">=</span> <span class=\"n\">feedgenerator</span><span class=\"o\">.</span><span class=\"n\">Rss201rev2Feed</span>\n\n    <span class=\"c1\"># TEMPLATE NAMES -- Optional. These should be strings</span>\n    <span class=\"c1\"># representing names of Django templates that the system should</span>\n    <span class=\"c1\"># use in rendering the title and description of your feed items.</span>\n    <span class=\"c1\"># Both are optional. If a template is not specified, the</span>\n    <span class=\"c1\"># item_title() or item_description() methods are used instead.</span>\n\n    <span class=\"n\">title_template</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n    <span class=\"n\">description_template</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n    <span class=\"c1\"># TITLE -- One of the following three is required. The framework</span>\n    <span class=\"c1\"># looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">title</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the</span>\n<span class=\"sd\">        feed&#39;s title as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">title</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s title as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;foo&#39;</span> <span class=\"c1\"># Hard-coded title.</span>\n\n    <span class=\"c1\"># LINK -- One of the following three is required. The framework</span>\n    <span class=\"c1\"># looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        # Takes the object returned by get_object() and returns the URL</span>\n<span class=\"sd\">        # of the HTML version of the feed as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the URL of the HTML version of the feed as a normal Python</span>\n<span class=\"sd\">        string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">link</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;/blog/&#39;</span> <span class=\"c1\"># Hard-coded URL.</span>\n\n    <span class=\"c1\"># FEED_URL -- One of the following three is optional. The framework</span>\n    <span class=\"c1\"># looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">feed_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        # Takes the object returned by get_object() and returns the feed&#39;s</span>\n<span class=\"sd\">        # own URL as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">feed_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s own URL as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">feed_url</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;/blog/rss/&#39;</span> <span class=\"c1\"># Hard-coded URL.</span>\n\n    <span class=\"c1\"># GUID -- One of the following three is optional. The framework looks</span>\n    <span class=\"c1\"># for them in this order. This property is only used for Atom feeds</span>\n    <span class=\"c1\"># (where it is the feed-level ID element). If not provided, the feed</span>\n    <span class=\"c1\"># link is used as the ID.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">feed_guid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the globally</span>\n<span class=\"sd\">        unique ID for the feed as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">feed_guid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s globally unique ID as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">feed_guid</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;/foo/bar/1234&#39;</span> <span class=\"c1\"># Hard-coded guid.</span>\n\n    <span class=\"c1\"># DESCRIPTION -- One of the following three is required. The framework</span>\n    <span class=\"c1\"># looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">description</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the feed&#39;s</span>\n<span class=\"sd\">        description as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">description</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s description as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">description</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Foo bar baz.&#39;</span> <span class=\"c1\"># Hard-coded description.</span>\n\n    <span class=\"c1\"># AUTHOR NAME --One of the following three is optional. The framework</span>\n    <span class=\"c1\"># looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">author_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the feed&#39;s</span>\n<span class=\"sd\">        author&#39;s name as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">author_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s author&#39;s name as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">author_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Sally Smith&#39;</span> <span class=\"c1\"># Hard-coded author name.</span>\n\n    <span class=\"c1\"># AUTHOR EMAIL --One of the following three is optional. The framework</span>\n    <span class=\"c1\"># looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">author_email</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the feed&#39;s</span>\n<span class=\"sd\">        author&#39;s email as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">author_email</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s author&#39;s email as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">author_email</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;test@example.com&#39;</span> <span class=\"c1\"># Hard-coded author email.</span>\n\n    <span class=\"c1\"># AUTHOR LINK --One of the following three is optional. The framework</span>\n    <span class=\"c1\"># looks for them in this order. In each case, the URL should include</span>\n    <span class=\"c1\"># the &quot;http://&quot; and domain name.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">author_link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the feed&#39;s</span>\n<span class=\"sd\">        author&#39;s URL as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">author_link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s author&#39;s URL as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">author_link</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;http://www.example.com/&#39;</span> <span class=\"c1\"># Hard-coded author URL.</span>\n\n    <span class=\"c1\"># CATEGORIES -- One of the following three is optional. The framework</span>\n    <span class=\"c1\"># looks for them in this order. In each case, the method/attribute</span>\n    <span class=\"c1\"># should return an iterable object that returns strings.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">categories</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the feed&#39;s</span>\n<span class=\"sd\">        categories as iterable over strings.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">categories</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s categories as iterable over strings.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">categories</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s2\">&quot;python&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">)</span> <span class=\"c1\"># Hard-coded list of categories.</span>\n\n    <span class=\"c1\"># COPYRIGHT NOTICE -- One of the following three is optional. The</span>\n    <span class=\"c1\"># framework looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">feed_copyright</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the feed&#39;s</span>\n<span class=\"sd\">        copyright notice as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">feed_copyright</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s copyright notice as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">feed_copyright</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Copyright (c) 2007, Sally Smith&#39;</span> <span class=\"c1\"># Hard-coded copyright notice.</span>\n\n    <span class=\"c1\"># TTL -- One of the following three is optional. The framework looks</span>\n    <span class=\"c1\"># for them in this order. Ignored for Atom feeds.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">ttl</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns the feed&#39;s</span>\n<span class=\"sd\">        TTL (Time To Live) as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">ttl</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the feed&#39;s TTL as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">ttl</span> <span class=\"o\">=</span> <span class=\"mi\">600</span> <span class=\"c1\"># Hard-coded Time To Live.</span>\n\n    <span class=\"c1\"># ITEMS -- One of the following three is required. The framework looks</span>\n    <span class=\"c1\"># for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">items</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the object returned by get_object() and returns a list of</span>\n<span class=\"sd\">        items to publish in this feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">items</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns a list of items to publish in this feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">items</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;Item 1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Item 2&#39;</span><span class=\"p\">)</span> <span class=\"c1\"># Hard-coded items.</span>\n\n    <span class=\"c1\"># GET_OBJECT -- This is required for feeds that publish different data</span>\n    <span class=\"c1\"># for different URL parameters. (See &quot;A complex example&quot; above.)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_object</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes the current request and the arguments from the URL, and</span>\n<span class=\"sd\">        returns an object represented by this feed. Raises</span>\n<span class=\"sd\">        django.core.exceptions.ObjectDoesNotExist on error.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ITEM TITLE AND DESCRIPTION -- If title_template or</span>\n    <span class=\"c1\"># description_template are not defined, these are used instead. Both are</span>\n    <span class=\"c1\"># optional, by default they will use the unicode representation of the</span>\n    <span class=\"c1\"># item.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_title</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        title as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_title</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the title for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_title</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Breaking News: Nothing Happening&#39;</span> <span class=\"c1\"># Hard-coded title.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_description</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        description as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_description</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the description for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_description</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;A description of the item.&#39;</span> <span class=\"c1\"># Hard-coded description.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_context_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns a dictionary to use as extra context if either</span>\n<span class=\"sd\">        description_template or item_template are used.</span>\n\n<span class=\"sd\">        Default implementation preserves the old behavior</span>\n<span class=\"sd\">        of using {&#39;obj&#39;: item, &#39;site&#39;: current_site} as the context.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ITEM LINK -- One of these three is required. The framework looks for</span>\n    <span class=\"c1\"># them in this order.</span>\n\n    <span class=\"c1\"># First, the framework tries the two methods below, in</span>\n    <span class=\"c1\"># order. Failing that, it falls back to the get_absolute_url()</span>\n    <span class=\"c1\"># method on each item returned by items().</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s URL.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the URL for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ITEM_GUID -- The following method is optional. If not provided, the</span>\n    <span class=\"c1\"># item&#39;s link is used by default.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_guid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as return by items(), and returns the item&#39;s ID.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"c1\"># ITEM_GUID_IS_PERMALINK -- The following method is optional. If</span>\n    <span class=\"c1\"># provided, it sets the &#39;isPermaLink&#39; attribute of an item&#39;s</span>\n    <span class=\"c1\"># GUID element. This method is used only when &#39;item_guid&#39; is</span>\n    <span class=\"c1\"># specified.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_guid_is_permalink</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns a boolean.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_guid_is_permalink</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>  <span class=\"c1\"># Hard coded value</span>\n\n    <span class=\"c1\"># ITEM AUTHOR NAME -- One of the following three is optional. The</span>\n    <span class=\"c1\"># framework looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_author_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        author&#39;s name as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_author_name</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the author name for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_author_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Sally Smith&#39;</span> <span class=\"c1\"># Hard-coded author name.</span>\n\n    <span class=\"c1\"># ITEM AUTHOR EMAIL --One of the following three is optional. The</span>\n    <span class=\"c1\"># framework looks for them in this order.</span>\n    <span class=\"c1\">#</span>\n    <span class=\"c1\"># If you specify this, you must specify item_author_name.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_author_email</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        author&#39;s email as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_author_email</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the author email for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_author_email</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;test@example.com&#39;</span> <span class=\"c1\"># Hard-coded author email.</span>\n\n    <span class=\"c1\"># ITEM AUTHOR LINK -- One of the following three is optional. The</span>\n    <span class=\"c1\"># framework looks for them in this order. In each case, the URL should</span>\n    <span class=\"c1\"># include the &quot;http://&quot; and domain name.</span>\n    <span class=\"c1\">#</span>\n    <span class=\"c1\"># If you specify this, you must specify item_author_name.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_author_link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        author&#39;s URL as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_author_link</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the author URL for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_author_link</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;http://www.example.com/&#39;</span> <span class=\"c1\"># Hard-coded author URL.</span>\n\n    <span class=\"c1\"># ITEM ENCLOSURE URL -- One of these three is required if you&#39;re</span>\n    <span class=\"c1\"># publishing enclosures. The framework looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_enclosure_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        enclosure URL.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_enclosure_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the enclosure URL for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_enclosure_url</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;/foo/bar.mp3&quot;</span> <span class=\"c1\"># Hard-coded enclosure link.</span>\n\n    <span class=\"c1\"># ITEM ENCLOSURE LENGTH -- One of these three is required if you&#39;re</span>\n    <span class=\"c1\"># publishing enclosures. The framework looks for them in this order.</span>\n    <span class=\"c1\"># In each case, the returned value should be either an integer, or a</span>\n    <span class=\"c1\"># string representation of the integer, in bytes.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_enclosure_length</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        enclosure length.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_enclosure_length</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the enclosure length for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_enclosure_length</span> <span class=\"o\">=</span> <span class=\"mi\">32000</span> <span class=\"c1\"># Hard-coded enclosure length.</span>\n\n    <span class=\"c1\"># ITEM ENCLOSURE MIME TYPE -- One of these three is required if you&#39;re</span>\n    <span class=\"c1\"># publishing enclosures. The framework looks for them in this order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_enclosure_mime_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        enclosure MIME type.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_enclosure_mime_type</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the enclosure MIME type for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_enclosure_mime_type</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;audio/mpeg&quot;</span> <span class=\"c1\"># Hard-coded enclosure MIME type.</span>\n\n    <span class=\"c1\"># ITEM PUBDATE -- It&#39;s optional to use one of these three. This is a</span>\n    <span class=\"c1\"># hook that specifies how to get the pubdate for a given item.</span>\n    <span class=\"c1\"># In each case, the method/attribute should return a Python</span>\n    <span class=\"c1\"># datetime.datetime object.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_pubdate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        pubdate.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_pubdate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the pubdate for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_pubdate</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"c1\"># Hard-coded pubdate.</span>\n\n    <span class=\"c1\"># ITEM UPDATED -- It&#39;s optional to use one of these three. This is a</span>\n    <span class=\"c1\"># hook that specifies how to get the updateddate for a given item.</span>\n    <span class=\"c1\"># In each case, the method/attribute should return a Python</span>\n    <span class=\"c1\"># datetime.datetime object.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_updateddate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        updateddate.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_updateddate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the updateddate for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_updateddate</span> <span class=\"o\">=</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"p\">(</span><span class=\"mi\">2005</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"c1\"># Hard-coded updateddate.</span>\n\n    <span class=\"c1\"># ITEM CATEGORIES -- It&#39;s optional to use one of these three. This is</span>\n    <span class=\"c1\"># a hook that specifies how to get the list of categories for a given</span>\n    <span class=\"c1\"># item. In each case, the method/attribute should return an iterable</span>\n    <span class=\"c1\"># object that returns strings.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_categories</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">item</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        categories.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_categories</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the categories for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_categories</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s2\">&quot;python&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;django&quot;</span><span class=\"p\">)</span> <span class=\"c1\"># Hard-coded categories.</span>\n\n    <span class=\"c1\"># ITEM COPYRIGHT NOTICE (only applicable to Atom feeds) -- One of the</span>\n    <span class=\"c1\"># following three is optional. The framework looks for them in this</span>\n    <span class=\"c1\"># order.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_copyright</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Takes an item, as returned by items(), and returns the item&#39;s</span>\n<span class=\"sd\">        copyright notice as a normal Python string.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_copyright</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Returns the copyright notice for every item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_copyright</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Copyright (c) 2007, Sally Smith&#39;</span> <span class=\"c1\"># Hard-coded copyright notice.</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"the-low-level-framework\">\n<h2>The low-level framework<a class=\"heading-anchor\" href=\"#the-low-level-framework\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Behind the scenes, the high-level RSS framework uses a lower-level framework\nfor generating feeds’ XML. This framework lives in a single module:\n<a class=\"reference external\" href=\"https://github.com/django/django/blob/master/django/utils/feedgenerator.py\">django/utils/feedgenerator.py</a>.</p>\n<p>You use this framework on your own, for lower-level feed generation. You can\nalso create custom feed generator subclasses for use with the <code class=\"docutils literal notranslate\"><span class=\"pre\">feed_type</span></code>\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code> option.</p>\n<section id=\"syndicationfeed-classes\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed</span></code> classes<a class=\"heading-anchor\" href=\"#syndicationfeed-classes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The <a class=\"reference internal\" href=\"/en/1.8/ref/utils/#module-django.utils.feedgenerator\" title=\"django.utils.feedgenerator: Syndication feed generation library -- used for generating RSS, etc.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">feedgenerator</span></code></a> module contains a base class:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.SyndicationFeed\" title=\"django.utils.feedgenerator.SyndicationFeed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.utils.feedgenerator.SyndicationFeed</span></code></a></p></li>\n</ul>\n<p>and several subclasses:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.RssUserland091Feed\" title=\"django.utils.feedgenerator.RssUserland091Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.utils.feedgenerator.RssUserland091Feed</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.Rss201rev2Feed\" title=\"django.utils.feedgenerator.Rss201rev2Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.utils.feedgenerator.Rss201rev2Feed</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.Atom1Feed\" title=\"django.utils.feedgenerator.Atom1Feed\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.utils.feedgenerator.Atom1Feed</span></code></a></p></li>\n</ul>\n<p>Each of these three classes knows how to render a certain type of feed as XML.\nThey share this interface:</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.SyndicationFeed.__init__\" title=\"django.utils.feedgenerator.SyndicationFeed.__init__\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.__init__()</span></code></a></dt><dd><p>Initialize the feed with the given dictionary of metadata, which applies to\nthe entire feed. Required keyword arguments are:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code></p></li>\n</ul>\n<p>There’s also a bunch of other optional keywords:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">language</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">author_email</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">author_name</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">author_link</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">categories</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">feed_url</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">feed_copyright</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">feed_guid</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ttl</span></code></p></li>\n</ul>\n<p>Any extra keyword arguments you pass to <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> will be stored in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">self.feed</span></code> for use with <a class=\"reference internal\" href=\"#custom-feed-generators\">custom feed generators</a>.</p>\n<p>All parameters should be Unicode objects, except <code class=\"docutils literal notranslate\"><span class=\"pre\">categories</span></code>, which\nshould be a sequence of Unicode objects.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.SyndicationFeed.add_item\" title=\"django.utils.feedgenerator.SyndicationFeed.add_item\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.add_item()</span></code></a></dt><dd><p>Add an item to the feed with the given parameters.</p>\n<p>Required keyword arguments are:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code></p></li>\n</ul>\n<p>Optional keyword arguments are:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">author_email</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">author_name</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">author_link</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pubdate</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">comments</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">unique_id</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">enclosure</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">categories</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">item_copyright</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ttl</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">updateddate</span></code></p></li>\n</ul>\n<p>Extra keyword arguments will be stored for <a class=\"reference internal\" href=\"#custom-feed-generators\">custom feed generators</a>.</p>\n<p>All parameters, if given, should be Unicode objects, except:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pubdate</span></code> should be a Python  <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a> object.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">updateddate</span></code> should be a Python  <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a> object.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">enclosure</span></code> should be an instance of\n<a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.Enclosure\" title=\"django.utils.feedgenerator.Enclosure\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.utils.feedgenerator.Enclosure</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">categories</span></code> should be a sequence of Unicode objects.</p></li>\n</ul>\n<aside class=\"version-note version-added\" data-version=\"1.7\">\n<p class=\"version-note-title\">New in Django 1.7</p><p>The optional <code class=\"docutils literal notranslate\"><span class=\"pre\">updateddate</span></code> argument was added.</p>\n</aside>\n</dd>\n<dt><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.SyndicationFeed.write\" title=\"django.utils.feedgenerator.SyndicationFeed.write\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.write()</span></code></a></dt><dd><p>Outputs the feed in the given encoding to outfile, which is a file-like object.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/en/1.8/ref/utils/#django.utils.feedgenerator.SyndicationFeed.writeString\" title=\"django.utils.feedgenerator.SyndicationFeed.writeString\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.writeString()</span></code></a></dt><dd><p>Returns the feed as a string in the given encoding.</p>\n</dd>\n</dl>\n<p>For example, to create an Atom 1.0 feed and print it to standard output:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">feedgenerator</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">datetime</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">feedgenerator</span><span class=\"o\">.</span><span class=\"n\">Atom1Feed</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;My Weblog&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">link</span><span class=\"o\">=</span><span class=\"s2\">&quot;http://www.example.com/&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;In which I write about what I ate today.&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">language</span><span class=\"o\">=</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">author_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Myself&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">feed_url</span><span class=\"o\">=</span><span class=\"s2\">&quot;http://example.com/atom.xml&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">add_item</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">&quot;Hot dog today&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">link</span><span class=\"o\">=</span><span class=\"s2\">&quot;http://www.example.com/entries/1/&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">pubdate</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">(),</span>\n<span class=\"gp\">... </span>    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;&lt;p&gt;Today I had a Vienna Beef hot dog. It was pink, plump and perfect.&lt;/p&gt;&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">writeString</span><span class=\"p\">(</span><span class=\"s1\">&#39;UTF-8&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span>\n<span class=\"go\">&lt;feed xmlns=&quot;http://www.w3.org/2005/Atom&quot; xml:lang=&quot;en&quot;&gt;</span>\n<span class=\"go\">...</span>\n<span class=\"go\">&lt;/feed&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"custom-feed-generators\">\n<h3>Custom feed generators<a class=\"heading-anchor\" href=\"#custom-feed-generators\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you need to produce a custom feed format, you’ve got a couple of options.</p>\n<p>If the feed format is totally custom, you’ll want to subclass\n<code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed</span></code> and completely replace the <code class=\"docutils literal notranslate\"><span class=\"pre\">write()</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">writeString()</span></code> methods.</p>\n<p>However, if the feed format is a spin-off of RSS or Atom (i.e. <a class=\"reference external\" href=\"http://georss.org/\">GeoRSS</a>, Apple’s\n<a class=\"reference external\" href=\"http://www.apple.com/itunes/podcasts/specs.html\">iTunes podcast format</a>, etc.), you’ve got a better choice. These types of\nfeeds typically add extra elements and/or attributes to the underlying format,\nand there are a set of methods that <code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed</span></code> calls to get these extra\nattributes. Thus, you can subclass the appropriate feed generator class\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">Atom1Feed</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">Rss201rev2Feed</span></code>) and extend these callbacks. They are:</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.root_attributes(self,</span> <span class=\"pre\">)</span></code></dt><dd><p>Return a <code class=\"docutils literal notranslate\"><span class=\"pre\">dict</span></code> of attributes to add to the root feed element\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">feed</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">channel</span></code>).</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.add_root_elements(self,</span> <span class=\"pre\">handler)</span></code></dt><dd><p>Callback to add elements inside the root feed element\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">feed</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">channel</span></code>). <code class=\"docutils literal notranslate\"><span class=\"pre\">handler</span></code> is an\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/xml.sax.utils.html#xml.sax.saxutils.XMLGenerator\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">XMLGenerator</span></code></a> from Python’s built-in SAX library;\nyou’ll call methods on it to add to the XML document in process.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.item_attributes(self,</span> <span class=\"pre\">item)</span></code></dt><dd><p>Return a <code class=\"docutils literal notranslate\"><span class=\"pre\">dict</span></code> of attributes to add to each item (<code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">entry</span></code>)\nelement. The argument, <code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>, is a dictionary of all the data passed to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.add_item()</span></code>.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.add_item_elements(self,</span> <span class=\"pre\">handler,</span> <span class=\"pre\">item)</span></code></dt><dd><p>Callback to add elements to each item (<code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">entry</span></code>) element.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">handler</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code> are as above.</p>\n</dd>\n</dl>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>If you override any of these methods, be sure to call the superclass methods\nsince they add the required elements for each feed format.</p>\n</aside>\n<p>For example, you might start implementing an iTunes RSS feed generator like so:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">iTunesFeed</span><span class=\"p\">(</span><span class=\"n\">Rss201rev2Feed</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">root_attributes</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">attrs</span> <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">iTunesFeed</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">root_attributes</span><span class=\"p\">()</span>\n        <span class=\"n\">attrs</span><span class=\"p\">[</span><span class=\"s1\">&#39;xmlns:itunes&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;http://www.itunes.com/dtds/podcast-1.0.dtd&#39;</span>\n        <span class=\"k\">return</span> <span class=\"n\">attrs</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">add_root_elements</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">handler</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">iTunesFeed</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">add_root_elements</span><span class=\"p\">(</span><span class=\"n\">handler</span><span class=\"p\">)</span>\n        <span class=\"n\">handler</span><span class=\"o\">.</span><span class=\"n\">addQuickElement</span><span class=\"p\">(</span><span class=\"s1\">&#39;itunes:explicit&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;clean&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Obviously there’s a lot more work to be done for a complete custom feed class,\nbut the above example should demonstrate the basic idea.</p>\n</section>\n</section>","rootId":"module-django.contrib.syndication","toc":[{"title":"The high-level framework","anchor":"the-high-level-framework","children":[{"title":"Overview","anchor":"overview","children":[]},{"title":"Feed classes","anchor":"feed-classes","children":[]},{"title":"A simple example","anchor":"a-simple-example","children":[]},{"title":"A complex example","anchor":"a-complex-example","children":[]},{"title":"Specifying the type of feed","anchor":"specifying-the-type-of-feed","children":[]},{"title":"Enclosures","anchor":"enclosures","children":[]},{"title":"Language","anchor":"language","children":[]},{"title":"URLs","anchor":"urls","children":[]},{"title":"Publishing Atom and RSS feeds in tandem","anchor":"publishing-atom-and-rss-feeds-in-tandem","children":[]},{"title":"Feed class reference","anchor":"feed-class-reference","children":[]}]},{"title":"The low-level framework","anchor":"the-low-level-framework","children":[{"title":"SyndicationFeed classes","anchor":"syndicationfeed-classes","children":[]},{"title":"Custom feed generators","anchor":"custom-feed-generators","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API Reference","url":"/en/1.8/ref/"},{"docname":"ref/contrib/index","title":"contrib packages","url":"/en/1.8/ref/contrib/"}],"prev":{"docname":"ref/contrib/staticfiles","title":"The staticfiles app","url":"/en/1.8/ref/contrib/staticfiles/"},"next":{"docname":"ref/contrib/webdesign","title":"django.contrib.webdesign","url":"/en/1.8/ref/contrib/webdesign/"},"formats":{"html":"/en/1.8/ref/contrib/syndication/","markdown":"/en/1.8/ref/contrib/syndication.md","json":"/en/1.8/ref/contrib/syndication.json"},"source":"https://github.com/django/django/blob/stable/1.8.x/docs/ref/contrib/syndication.txt","official":"https://docs.djangoproject.com/en/1.8/ref/contrib/syndication/","inVersions":["dev","6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9","1.8"],"inLocales":["en"]}