{"title":"L’infrastructure de syndication par flux","version":"2.1","locale":"fr","docname":"ref/contrib/syndication","url":"/fr/2.1/ref/contrib/syndication/","canonical":"https://djangodocs.dev/fr/2.1/ref/contrib/syndication/","summary":"Django est livré avec une infrastructure de génération de flux de syndication de haut niveau qui facilite la création de flux RSS et Atom . Pour créer un flux de…","html":"<span id=\"the-syndication-feed-framework\"></span><h1>L’infrastructure de syndication par flux<a class=\"heading-anchor\" href=\"#module-django.contrib.syndication\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django est livré avec une infrastructure de génération de flux de syndication de haut niveau qui facilite la création de flux <a class=\"reference external\" href=\"http://www.whatisrss.com/\">RSS</a> et <a class=\"reference external\" href=\"https://tools.ietf.org/html/rfc4287\">Atom</a>.</p>\n<p>Pour créer un flux de syndication, tout ce que vous avez à faire est d’écrire une courte classe Python. On peut créer autant de flux que nécessaire.</p>\n<p>Django contient également une API de génération de flux de plus bas niveau. Celle-ci peut être utilisée pour générer des flux en dehors du contexte Web ou d’une autre manière nécessitant l’accès à un plus bas niveau.</p>\n<section id=\"the-high-level-framework\">\n<h2>L’infrastructure de haut niveau<a class=\"heading-anchor\" href=\"#the-high-level-framework\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"overview\">\n<h3>Aperçu<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’infrastructure de génération de flux de syndication de haut niveau est fournie par la classe <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>. Pour créer un flux, écrivez une classe <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> et faites pointer votre <a class=\"reference internal\" href=\"/fr/2.1/topics/http/urls/\"><span class=\"doc\">configuration d’URL</span></a> vers cette classe.</p>\n</section>\n<section id=\"feed-classes\">\n<h3>Classes <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code> (flux)<a class=\"heading-anchor\" href=\"#feed-classes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Une classe <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> est une classe Python qui représente un flux de syndication. Un flux peut être simple (par exemple un flux d’actualités d’un site ou un flux élémentaire affichant les derniers articles d’un blog) ou plus complexe (par exemple un flux affichant tous les articles de blog d’une certaine catégorie, celle-ci étant variable).</p>\n<p>Les classes de flux héritent de <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>. Elles peuvent résider n’importe où dans votre code source.</p>\n<p>Les instances de classes <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> sont des vues qui peuvent être utilisées dans la <a class=\"reference internal\" href=\"/fr/2.1/topics/http/urls/\"><span class=\"doc\">configuration d’URL</span></a>.</p>\n</section>\n<section id=\"a-simple-example\">\n<h3>Un exemple simple<a class=\"heading-anchor\" href=\"#a-simple-example\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Cet exemple simple, tiré d’un hypothétique site d’actualités de bévues policières, décrit un flux des cinq dernières actualités :</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.urls</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>Pour faire le lien entre une URL et ce flux, placez une instance de l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code> dans la <a class=\"reference internal\" href=\"/fr/2.1/topics/http/urls/\"><span class=\"doc\">configuration d’URL</span></a>. Par exemple :</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.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</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\">path</span><span class=\"p\">(</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>Remarque :</p>\n<ul class=\"simple\">\n<li><p>La classe de flux hérite de <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> et <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> correspondent respectivement aux éléments <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> et <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;description&gt;</span></code> du standard RSS.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> est, tout simplement, une méthode qui renvoie une liste d’objets qui devraient être inclus dans l’alimentation du flux en tant qu’éléments <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;item&gt;</span></code>. Bien que cet exemple retourne des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">NewsItem</span></code> à l’aide de <a class=\"reference internal\" href=\"/fr/2.1/ref/models/querysets/\"><span class=\"doc\">l’API  QuerySet de Django</span></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> n’est pas tenu de renvoyer des instances de modèles. Même si vous obtenez quelques fonctionnalités supplémentaires en utilisant des modèles de Django, <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> peut renvoyer n’importe quel type d’objet souhaité.</p></li>\n<li><p>Si vous créez un flux Atom, plutôt qu’un flux RSS, définissez l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code> la place de l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code>. Voir <a class=\"reference internal\" href=\"#publishing-atom-and-rss-feeds-in-tandem\">Publication de flux Atom et RSS en tandem</a>, plus loin, pour un exemple.</p></li>\n</ul>\n<p>Il reste une chose à faire. Dans un flux RSS, chaque <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;item&gt;</span></code> a un <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> et <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;description&gt;</span></code>. Nous devons dire au framework ce qu’il faut mettre dans ces éléments.</p>\n<ul>\n<li><p>Pour le contenu de <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;title&gt;</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;description&gt;</span></code>, Django essaie d’appeler les méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">item_title()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">item_description()</span></code> de la classe <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>. Un seul paramètre leur est passé, <code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>, qui est l’objet lui-même. Ces méthodes sont facultatives ; par défaut, la représentation textuelle de l’objet est utilisée pour les deux.</p>\n<p>Si vous voulez utiliser une mise en forme spéciale pour le titre ou la description, <a class=\"reference internal\" href=\"/fr/2.1/ref/templates/language/\"><span class=\"doc\">les gabarits de Django</span></a> peuvent être utilisés à la place de ces méthodes. Les chemins de ces gabarits peuvent être spécifiés par les attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">title_template</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">description_template</span></code> de la classe <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>. Les gabarits sont utilisés pour chaque élément et deux variables de contexte leurs sont passées :</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> - L’objet courant (l’un des objets que vous retournez dans <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> – Un objet <a class=\"reference internal\" href=\"/fr/2.1/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> représentant le site actuel. C’est utile pour <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site.domain</span> <span class=\"pre\">}}</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site.name</span> <span class=\"pre\">}}</span></code>. Si vous n’avez <em>pas</em> installé le framework de sites de Django, il s’agira d’un objet <a class=\"reference internal\" href=\"/fr/2.1/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>. Voir la <a class=\"reference internal\" href=\"/fr/2.1/ref/contrib/sites/#id3\"><span class=\"std std-ref\">documentation du framework de sites</span></a> pour plus d’information.</p></li>\n</ul>\n<p>Voir <a class=\"reference internal\" href=\"#a-complex-example\">Un exemple complexe</a> ci-dessous pour l’utilisation d’un gabarit pour la description.</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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Il est aussi un moyen de transmettre des informations supplémentaires au gabarit, en plus du titre et la description, si vous avez besoin de fournir plus que ces deux variables. Vous pouvez fournir votre propre implémentation de la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data</span></code> dans votre sous-classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code>. Par exemple</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=\"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>Et le gabarit :</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>Cette méthode sera appelée une fois pour chaque élément de la liste renvoyée par <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> avec les paramètres nommés suivants:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>: l’élément en cours. Pour des raisons de compatibilité descendante, le nom de cette variable de contexte est <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>: l’objet renvoyé par <code class=\"docutils literal notranslate\"><span class=\"pre\">get_object()</span></code>. Par défaut, ce paramètre n’est pas fourni dans les gabarits pour éviter toute confusion avec <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">obj</span> <span class=\"pre\">}}</span></code> (voir ci-dessus), mais vous pouvez l’utiliser dans votre implémentation de <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>: le site actuel comme décrit ci-dessus.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>: la requête en cours.</p></li>\n</ul>\n<p>Le comportement de <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data()</span></code> imite celui des <a class=\"reference internal\" href=\"/fr/2.1/topics/class-based-views/generic-display/#adding-extra-context\"><span class=\"std std-ref\">vues génériques</span></a>, vous êtes censé appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code> pour obtenir les données de contexte de la classe parente, puis ajouter vos données et renvoyer le dictionnaire modifié.</p>\n</li>\n<li><p>Pour définir le contenu de <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;link&gt;</span></code>, vous avez deux options. Pour chaque élément dans <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code>, Django essaie d’abord d’appeler la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">item_link()</span></code> de la classe <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>. De manière semblable aux attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code>, la méthode reçoit un seul paramètre, <code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>. Si cette méthode n’existe pas, Django essaie d’appeler une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> de cet objet. Aussi bien <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> que <code class=\"docutils literal notranslate\"><span class=\"pre\">item_link()</span></code> doivent renvoyer l’URl de l’élément sous forme d’une chaîne Python normale. Comme avec <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code>, le résultat de <code class=\"docutils literal notranslate\"><span class=\"pre\">item_link()</span></code> sera directement inclus dans l’URL, vous êtes donc responsable d’effectuer toute opération nécessaire (échappement, conversion en ASCII) dans la méthode elle-même.</p></li>\n</ul>\n</section>\n<section id=\"a-complex-example\">\n<h3>Un exemple complexe<a class=\"heading-anchor\" href=\"#a-complex-example\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’application gère aussi des flux plus complexes, via des paramètres.</p>\n<p>Par exemple, un site Web pourrait offrir un flux RSS des crimes récents pour chaque section de police de la ville. Il serait stupide de créer une classe <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> séparée pour chaque section de police ; cela violerait le <a class=\"reference internal\" href=\"/fr/2.1/misc/design-philosophies/#dry\"><span class=\"std std-ref\">principe DRY</span></a> et lierait les données à la logique de programmation. Au lieu de cela, le système de syndication permet d’accéder aux paramètres transmis par l’intermédiaire de la <a class=\"reference internal\" href=\"/fr/2.1/topics/http/urls/\"><span class=\"doc\">configuration d’URL</span></a> afin que les flux puissent produire des éléments en fonction d’informations présentes dans l’URL du flux.</p>\n<p>Le flux du secteur de police pourrait être accessible via des URL comme :</p>\n<ul class=\"simple\">\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">/beats/613/rss/</span></code> – Renvoie les crimes récents pour le secteur 613.</p></li>\n<li><p><code class=\"file docutils literal notranslate\"><span class=\"pre\">/beats/1424/rss/</span></code> – Renvoie les crimes récents pour le secteur 1424.</p></li>\n</ul>\n<p>Elles peuvent correspondre à une ligne de <a class=\"reference internal\" href=\"/fr/2.1/topics/http/urls/\"><span class=\"doc\">configuration d’URL</span></a> telle que :</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\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;beats/&lt;int:beat_id&gt;/rss/&#39;</span><span class=\"p\">,</span> <span class=\"n\">BeatFeed</span><span class=\"p\">()),</span>\n</code></pre></div>\n<p>Comme pour une vue, les paramètres dans l’URL sont transmis à la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">get_object()</span></code> en même temps que l’objet requête.</p>\n<p>Voici le code correspondant à ces flux par secteur :</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>Pour générer les balises <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> et <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;description&gt;</span></code> du flux, Django utilise les méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">title()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">link()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">description()</span></code>. Dans l’exemple précédent, il s’agissait de simples attributs de classe textuels, mais cet exemple illustre qu’il peut aussi bien s’agir de chaînes que de méthodes. Pour chacune de ces valeurs <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code>, Django suit cet algorithme :</p>\n<ul class=\"simple\">\n<li><p>Il commence par essayer d’appeler une méthode en transmettant le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code>, où <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> est l’objet renvoyé par <code class=\"docutils literal notranslate\"><span class=\"pre\">get_object()</span></code>.</p></li>\n<li><p>Si cela échoue, il essaie d’appeler une méthode sans paramètre.</p></li>\n<li><p>En dernier recours, il utilise l’attribut de classe.</p></li>\n</ul>\n<p>Notez également que <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code> utilise le même algorithme, il essaie d’abord <code class=\"docutils literal notranslate\"><span class=\"pre\">items(obj)</span></code>, puis <code class=\"docutils literal notranslate\"><span class=\"pre\">items()</span></code>, et pour terminer un attribut de classe <code class=\"docutils literal notranslate\"><span class=\"pre\">items</span></code> (qui doit être une liste).</p>\n<p>Nous utilisons un gabarit pour les descriptions des éléments. Il peut être très 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>Cependant, vous êtes libre d’ajouter de la mise en forme selon vos besoins.</p>\n<p>La classe <code class=\"docutils literal notranslate\"><span class=\"pre\">ExampleFeed</span></code> plus bas dans ce document apporte une documentation complète sur les méthodes et attributs des classes <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>.</p>\n</section>\n<section id=\"specifying-the-type-of-feed\">\n<h3>Indication du type de flux<a class=\"heading-anchor\" href=\"#specifying-the-type-of-feed\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Par défaut, les flux produits par cette infrastructure utilisent RSS 2.0.</p>\n<p>Pour changer cela, ajoutez un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">feed_type</span></code> à votre classe <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> comme ceci :</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>Notez que <code class=\"docutils literal notranslate\"><span class=\"pre\">feed_type</span></code> est défini sur un objet classe, pas une instance.</p>\n<p>Les types de flux actuellement disponibles sont :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/2.1/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. Valeur par défaut).</p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/2.1/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=\"/fr/2.1/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>Annexes<a class=\"heading-anchor\" href=\"#enclosures\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pour définir des annexes, telles que celles utilisées pour créer des flux « podcast », utilisez le point d’entrée <code class=\"docutils literal notranslate\"><span class=\"pre\">item_enclosures</span></code> ou, dans le cas où vous n’avez qu’une seule annexe par élément, les points d’entrée <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> et <code class=\"docutils literal notranslate\"><span class=\"pre\">item_enclosure_mime_type</span></code>. Voir la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">ExampleFeed</span></code> ci-dessous pour des exemples d’utilisation.</p>\n</section>\n<section id=\"language\">\n<h3>Langue<a class=\"heading-anchor\" href=\"#language\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les flux créés par l’infrastructure de syndication incluent automatiquement la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;language&gt;</span></code> adéquate (RSS 2.0) ou l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">xml:lang</span></code> (Atom). Le contenu provient directement du réglage <a class=\"reference internal\" href=\"/fr/2.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a>.</p>\n</section>\n<section id=\"urls\">\n<h3>URL<a class=\"heading-anchor\" href=\"#urls\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’attribut/méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code> peut renvoyer soit un chemin absolu (par ex. <code class=\"file docutils literal notranslate\"><span class=\"pre\">&quot;/blog/&quot;</span></code>), soit une URL avec domaine pleinement qualifié et protocole (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;https://www.example.com/blog/&quot;</span></code>). Si <code class=\"docutils literal notranslate\"><span class=\"pre\">link</span></code> ne renvoie pas de domaine, l’infrastructure de syndication insère le domaine du site actuel, en fonction du réglage <a class=\"reference internal\" href=\"/fr/2.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a>.</p>\n<p>Les flux Atom exigent un <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;link</span> <span class=\"pre\">rel=&quot;self&quot;&gt;</span></code> qui définit l’emplacement actuel du flux. L’infrastructure de syndication le remplit automatiquement, en utilisant le domaine du site actuel en fonction du réglage <a class=\"reference internal\" href=\"/fr/2.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a>.</p>\n</section>\n<section id=\"publishing-atom-and-rss-feeds-in-tandem\">\n<h3>Publication de flux Atom et RSS en tandem<a class=\"heading-anchor\" href=\"#publishing-atom-and-rss-feeds-in-tandem\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Certains développeurs aiment bien rendre disponible à la fois des version Atom <em>et</em> RSS de leurs flux. C’est facile à faire avec Django : il suffit de créer une sous-classe de votre classe <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> et de définir <code class=\"docutils literal notranslate\"><span class=\"pre\">feed_type</span></code> à une autre valeur. Puis mettez à jour votre configuration d’URL pour ajouter les versions supplémentaires.</p>\n<p>Voici un exemple complet :</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>Dans cet exemple, le flux RSS utilise une <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> alors que le flux Atom utilise <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code>. C’est dû au fait que les flux Atom n’ont pas de « description » au niveau du flux, mais ils possèdent un champ « subtitle ».</p>\n<p>Si vous fournissez une <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> dans votre classe <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>, django ne va <em>pas</em> automatiquement déplacer sont contenu dans l’élément <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code>, car un sous-titre et une description ne font pas forcément référence à la même chose. Vous devez plutôt définir un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code>.</p>\n<p>Dans l’exemple ci-dessus, nous avons simplement défini le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">subtitle</span></code> du flux Atom à partir du contenu <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> du flux RSS, car ce dernier était déjà assez court.</p>\n</aside>\n<p>Ainsi que la configuration d’URL qui va avec :</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.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</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\">AtomSiteNewsFeed</span><span class=\"p\">,</span> <span class=\"n\">RssSiteNewsFeed</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\">path</span><span class=\"p\">(</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\">path</span><span class=\"p\">(</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>Référence de la classe de flux <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code><a class=\"heading-anchor\" href=\"#feed-class-reference\"><span class=\"visually-hidden\">Lien vers cette rubrique</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\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Cet exemple illustre tous les attributs et méthodes possibles pour une classe <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>:</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;https://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 string 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;https://www.example.com/&#39;</span> <span class=\"c1\"># Hard-coded author URL.</span>\n\n    <span class=\"c1\"># ITEM ENCLOSURES -- One of the following three is optional. The</span>\n    <span class=\"c1\"># framework looks for them in this order. If one of them is defined,</span>\n    <span class=\"c1\"># ``item_enclosure_url``, ``item_enclosure_length``, and</span>\n    <span class=\"c1\"># ``item_enclosure_mime_type`` will have no effect.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_enclosures</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 a list of</span>\n<span class=\"sd\">        ``django.utils.feedgenerator.Enclosure`` objects.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">item_enclosures</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 ``django.utils.feedgenerator.Enclosure`` list for every</span>\n<span class=\"sd\">        item in the feed.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n\n    <span class=\"n\">item_enclosures</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>  <span class=\"c1\"># Hard-coded enclosure list</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 and you&#39;re not using ``item_enclosures``. 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_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 and you&#39;re not using ``item_enclosures``. The</span>\n    <span class=\"c1\"># framework looks for them in this order. In each case, the returned</span>\n    <span class=\"c1\"># value should be either an integer, or a string representation of the</span>\n    <span class=\"c1\"># 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 and you&#39;re not using ``item_enclosures``. 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_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>L’infrastructure de bas niveau<a class=\"heading-anchor\" href=\"#the-low-level-framework\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En arrière-plan, l’infrastructure RSS de haut niveau utilise une infrastructure de plus bas niveau pour produire le code XML des flux. Cette infrastructure se trouve dans un module unique : <a class=\"reference external\" href=\"https://github.com/django/django/blob/master/django/utils/feedgenerator.py\">django/utils/feedgenerator.py</a>.</p>\n<p>Cette infrastructure peut être utilisée pour générer des flux à un plus bas niveau, mais c’est à vous de vous débrouillez. Il est aussi possible de créer des sous-classes de génération de flux personnalisées exploitables avec l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">feed_type</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code>.</p>\n<section id=\"syndicationfeed-classes\">\n<h3>Classes <code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed</span></code><a class=\"heading-anchor\" href=\"#syndicationfeed-classes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Le module <a class=\"reference internal\" href=\"/fr/2.1/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> contient une classe de base :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/2.1/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>et plusieurs sous-classes :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/2.1/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=\"/fr/2.1/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=\"/fr/2.1/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>Chacune de ces trois classes sait comment produire un certain type de flux sous forme XML. Elles partagent cette interface :</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/fr/2.1/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>Initialise le flux avec le dictionnaire de métadonnées indiqué, qui s’applique au flux entier. Les paramètres nommés obligatoires sont :</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>Il existe également un lot de paramètres nommés facultatifs :</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>Tout paramètre nommé supplémentaire passé à <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> est stocké dans <code class=\"docutils literal notranslate\"><span class=\"pre\">self.feed</span></code>, à l’usage de <a class=\"reference internal\" href=\"#custom-feed-generators\">générateurs de flux personnalisés</a>.</p>\n<p>Tous les paramètres doivent être des chaînes, sauf <code class=\"docutils literal notranslate\"><span class=\"pre\">categories</span></code>, qui doit être une séquence de chaînes. Prenez garde à certains caractères de contrôle qui ne sont <a class=\"reference external\" href=\"https://www.w3.org/International/questions/qa-controls\">pas autorisés</a> dans les documents XML. Si votre contenu en contient certains, vous pouvez rencontrer une exception <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ValueError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValueError</span></code></a> lors de la production du flux.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/2.1/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>Ajoute un élément au flux avec les paramètres donnés.</p>\n<p>Les paramètres nommés obligatoires sont :</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>Les paramètres nommés facultatifs sont :</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\">enclosures</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>Des paramètres nommés supplémentaires sont stockés pour des <a class=\"reference internal\" href=\"#custom-feed-generators\">générateurs de flux personnalisés</a>.</p>\n<p>Tous les paramètres, s’ils sont fournis, doivent être des chaînes, à l’exception de :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pubdate</span></code> doit être un objet Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">updateddate</span></code> doit être un objet Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">datetime</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">enclosures</span></code> doit être une liste d’instances <a class=\"reference internal\" href=\"/fr/2.1/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> doit être une liste de chaînes.</p></li>\n</ul>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/2.1/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>Produit le flux dans le codage indiqué vers <code class=\"docutils literal notranslate\"><span class=\"pre\">outfile</span></code>, qui est un objet de type fichier.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/2.1/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>Renvoie le flux sous forme de chaîne dans le codage indiqué.</p>\n</dd>\n</dl>\n<p>Par exemple, pour créer un flux Atom 1.0 et l’afficher vers la sortie standard :</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;https://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;https://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;https://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>Générateurs de flux personnalisés<a class=\"heading-anchor\" href=\"#custom-feed-generators\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous avez besoin de produire un format de flux personnalisé, plusieurs options s’offrent à vous.</p>\n<p>Si le flux est totalement personnalisé, on peut créer une sous-classe de <code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed</span></code> et complètement remplacer les méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">write()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">writeString()</span></code>.</p>\n<p>Cependant, si le format de flux est dérivé de RSS ou d’Atom (par ex. <a class=\"reference external\" href=\"http://georss.org/\">GeoRSS</a>, format <a class=\"reference external\" href=\"https://www.apple.com/itunes/podcasts/specs.html\">podcast iTunes</a> d’Apple, etc.), il existe une meilleure solution. Ces types de flux ajoutent généralement des éléments ou attributs supplémentaires au format dont ils s’inspirent, et il y a quelques méthodes appelées par <code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed</span></code> pour obtenir ces attributs supplémentaires. Ainsi, vous pouvez hériter de la classe de génération de flux adéquate (<code class=\"docutils literal notranslate\"><span class=\"pre\">Atom1Feed</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">Rss201rev2Feed</span></code>) et étendre ces points d’entrée. Les voici :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">SyndicationFeed.root_attributes(self)</span></code></dt><dd><p>Renvoie un <code class=\"docutils literal notranslate\"><span class=\"pre\">dict</span></code> d’attributs à ajouter à l’élément racine du flux (<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>Point d’entrée pour ajouter des éléments à l’intérieur de l’élément racine du flux (<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> est une classe <a class=\"reference external\" href=\"https://docs.python.org/3/library/xml.sax.utils.html#xml.sax.saxutils.XMLGenerator\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">XMLGenerator</span></code></a> de la bibliothèque SAX intégrée à Python ; ce sont ses méthodes que vous appellerez pour ajouter du contenu au document XML en cours de production.</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>Renvoie un <code class=\"docutils literal notranslate\"><span class=\"pre\">dict</span></code> d’attributs à ajouter à chaque élément (<code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">entry</span></code>). Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code> est un dictionnaire de toutes les données transmises à <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>Point d’entrée pour ajouter des éléments à chaque élément (<code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">entry</span></code>) du flux. <code class=\"docutils literal notranslate\"><span class=\"pre\">handler</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">item</span></code> sont identiques à ce qui est expliqué ci-dessus.</p>\n</dd>\n</dl>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Si vous surchargez une de ces méthodes, assurez-vous d’appeler les méthodes de la classe parente (super) car celles-ci ajoutent les éléments obligatoires de chaque format de flux.</p>\n</aside>\n<p>Par exemple, voici comment l’on pourrait commencer à implémenter un générateur RSS de flux iTunes :</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=\"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=\"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>Il y a évidemment encore bien du travail pour arriver à une classe de flux personnalisé complète, mais l’exemple ci-dessus présente l’idée de base.</p>\n</section>\n</section>","rootId":"module-django.contrib.syndication","toc":[{"title":"L’infrastructure de haut niveau","anchor":"the-high-level-framework","children":[{"title":"Aperçu","anchor":"overview","children":[]},{"title":"Classes Feed (flux)","anchor":"feed-classes","children":[]},{"title":"Un exemple simple","anchor":"a-simple-example","children":[]},{"title":"Un exemple complexe","anchor":"a-complex-example","children":[]},{"title":"Indication du type de flux","anchor":"specifying-the-type-of-feed","children":[]},{"title":"Annexes","anchor":"enclosures","children":[]},{"title":"Langue","anchor":"language","children":[]},{"title":"URL","anchor":"urls","children":[]},{"title":"Publication de flux Atom et RSS en tandem","anchor":"publishing-atom-and-rss-feeds-in-tandem","children":[]},{"title":"Référence de la classe de flux Feed","anchor":"feed-class-reference","children":[]}]},{"title":"L’infrastructure de bas niveau","anchor":"the-low-level-framework","children":[{"title":"Classes SyndicationFeed","anchor":"syndicationfeed-classes","children":[]},{"title":"Générateurs de flux personnalisés","anchor":"custom-feed-generators","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/2.1/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/2.1/ref/contrib/"}],"prev":{"docname":"ref/contrib/staticfiles","title":"L’application de gestion des fichiers statiques (staticfiles)","url":"/fr/2.1/ref/contrib/staticfiles/"},"next":{"docname":"ref/csrf","title":"Protection contre le « Cross site request forgery » (CSRF)","url":"/fr/2.1/ref/csrf/"},"formats":{"html":"/fr/2.1/ref/contrib/syndication/","markdown":"/fr/2.1/ref/contrib/syndication.md","json":"/fr/2.1/ref/contrib/syndication.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/ref/contrib/syndication.txt","official":"https://docs.djangoproject.com/fr/2.1/ref/contrib/syndication/","inVersions":["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"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}