{"title":"L’infrastructure des « sites »","version":"3.0","locale":"fr","docname":"ref/contrib/sites","url":"/fr/3.0/ref/contrib/sites/","canonical":"https://djangodocs.dev/fr/3.0/ref/contrib/sites/","summary":"Django est livré avec un système facultatif de « sites ». C’est un point d’extension pour associer des objets et des fonctionnalités à certains sites Web, et c’est…","html":"<span id=\"the-sites-framework\"></span><h1>L’infrastructure des « sites »<a class=\"heading-anchor\" href=\"#module-django.contrib.sites\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django est livré avec un système facultatif de « sites ». C’est un point d’extension pour associer des objets et des fonctionnalités à certains sites Web, et c’est un lieu de regroupement pour les noms de domaine et les noms « explicites » de vos sites Django.</p>\n<p>Utilisez-le si une seule installation de Django est utilisée pour plus d’un site Web et que vous avez besoin de différencier ces sites sur certains points.</p>\n<p>L’infrastructure de sites est basée principalement sur ce modèle :</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.models.Site\">\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\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">Site</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.models.Site\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un modèle pour le stockage des attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> d’un site Web.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.models.Site.domain\">\n<span class=\"sig-name descname\"><span class=\"pre\">domain</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.models.Site.domain\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom de domaine pleinement qualifié associé au site Web. Par exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">www.example.com</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.models.Site.name\">\n<span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.models.Site.name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un nom lisible « explicite » pour le site Web.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Le réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> indique l’identifiant de base de données de l’objet <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> associé à ce fichier de réglages particulier. Si ce réglage est absent, la fonction <a class=\"reference internal\" href=\"#django.contrib.sites.shortcuts.get_current_site\" title=\"django.contrib.sites.shortcuts.get_current_site\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_current_site()</span></code></a> essaie d’obtenir le site actuel en comparant le <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site.domain\" title=\"django.contrib.sites.models.Site.domain\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">domain</span></code></a> au nom d’hôte provenant de la méthode <a class=\"reference internal\" href=\"/fr/3.0/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code></a>.</p>\n<p>La manière de l’utiliser est à votre convenance, mais Django l’utilise automatiquement dans un certain nombre de situations à l’aide de quelques conventions.</p>\n<section id=\"example-usage\">\n<h2>Exemple d’utilisation<a class=\"heading-anchor\" href=\"#example-usage\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pourquoi auriez-vous besoin du système de sites ? Des exemples offrent la meilleure des explications.</p>\n<section id=\"associating-content-with-multiple-sites\">\n<h3>Association de contenu à plusieurs sites différents<a class=\"heading-anchor\" href=\"#associating-content-with-multiple-sites\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les sites <a class=\"reference external\" href=\"http://www.ljworld.com/\">LJWorld.com</a> et <a class=\"reference external\" href=\"http://www.lawrence.com/\">Lawrence.com</a> sont exploités par la même agence de presse – le journal Lawrence Journal-World à Lawrence, Kansas. LJWorld.com se concentrait sur l’actualité, tandis que Lawrence.com mettait l’accent sur le divertissement local. Mais parfois, les éditeurs veulaient publier un article sur les <em>deux</em> sites.</p>\n<p>La manière naïve de résoudre ce problème serait d’exiger de chaque rédacteur de site de publier la même histoire deux fois : une fois pour  LJWorld.com et une autre fois pour Lawrence.com. Mais c’est vraiment inefficace pour les producteurs des sites, sans compter qu’il est redondant de stocker plusieurs copies de la même histoire dans la base de données.</p>\n<p>Une meilleure solution évite la duplication de contenu : les deux sites utilisent le même article dans la base de données et chaque article est associé à un ou plusieurs sites. Dans la terminologie des modèles Django, ceci est représenté par un champ <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> dans le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code>:</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">sites</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Site</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Ceci effectue plusieurs choses de manière élégante :</p>\n<ul>\n<li><p>Les producteurs de sites peuvent éditer tous les contenus, pour les deux sites, dans une même interface (l’administration de Django).</p></li>\n<li><p>La même histoire n’a pas besoin d’être publiée deux fois dans la base de données ; elle constitue un seul enregistrement de base de données.</p></li>\n<li><p>Les développeurs des sites peuvent utiliser le même code de vue Django pour les deux sites. Le code de vue qui affiche une histoire donnée vérifie que l’histoire demandée se trouve bien sur le site actuel. Cela donne quelque chose comme :</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.sites.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_current_site</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">article_detail</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">article_id</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Article</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=\"nb\">id</span><span class=\"o\">=</span><span class=\"n\">article_id</span><span class=\"p\">,</span> <span class=\"n\">sites__id</span><span class=\"o\">=</span><span class=\"n\">get_current_site</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">id</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">Http404</span><span class=\"p\">(</span><span class=\"s2\">&quot;Article does not exist on this site&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"associating-content-with-a-single-site\">\n<h3>Association de contenu à un seul site<a class=\"heading-anchor\" href=\"#associating-content-with-a-single-site\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>De même, vous pouvez associer un modèle au modèle <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> par une relation plusieurs-à-un, avec une clé <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>.</p>\n<p>Par exemple, si un article ne doit apparaître que sur un seul site, vous pourriez utiliser un modèle tel que celui-ci :</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">headline</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">200</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">site</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Site</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Les bénéfices sont les mêmes que ceux de la section précédente.</p>\n</section>\n<section id=\"hooking-into-the-current-site-from-views\">\n<span id=\"hooking-into-current-site-from-views\"></span><h3>Interception du site actuel dans les vues<a class=\"heading-anchor\" href=\"#hooking-into-the-current-site-from-views\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vous pouvez exploiter l’infrastructure des sites dans les vues Django pour effectuer des opérations particulières sur la base du site pour lequel la vue est appelée. 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.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">SITE_ID</span> <span class=\"o\">==</span> <span class=\"mi\">3</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something.</span>\n        <span class=\"k\">pass</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something else.</span>\n        <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Naturellement, ce n’est pas du tout élégant de figer des identifiants de site dans le code de cette manière. Ce genre de pratique devrait être réservé à des corrections exceptionnelles quand on est très pressé. La façon propre de faire la même chose est de se baser sur le nom de domaine du site actuel :</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.sites.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_current_site</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">get_current_site</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">domain</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;foo.com&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something</span>\n        <span class=\"k\">pass</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something else.</span>\n        <span class=\"k\">pass</span>\n</code></pre></div>\n<p>Cela présente aussi l’avantage de vérifier si l’infrastructure des sites est installée et de renvoyer une instance <a class=\"reference internal\" href=\"#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> quand ce n’est pas le cas.</p>\n<p>Si vous n’avez pas accès à l’objet de requête, vous pouvez utiliser la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">get_current()</span></code> du gestionnaire du modèle <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>. Vous devez ensuite vous assurer que le fichier des réglages contient bien le réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a>. Cet exemple est équivalent au précédent :</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_function_without_request</span><span class=\"p\">():</span>\n    <span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">domain</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;foo.com&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something</span>\n        <span class=\"k\">pass</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something else.</span>\n        <span class=\"k\">pass</span>\n</code></pre></div>\n</section>\n<section id=\"getting-the-current-domain-for-display\">\n<h3>Accès au domaine actuel pour l’affichage<a class=\"heading-anchor\" href=\"#getting-the-current-domain-for-display\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>LJWorld.com et Lawrence.com ont tous deux une fonction d’alerte par courriel, ce qui permet aux lecteurs de s’inscrire pour recevoir des notifications lorsque des actualités apparaissent. C’est assez simple : un lecteur s’inscrit avec un formulaire Web et reçoit immédiatement un courriel disant « Merci pour votre inscription ».</p>\n<p>Il serait inefficace et redondant d’implémenter deux fois le code de ce processus d’inscription, ce qui fait que les sites utilisent le même code en arrière-plan. Mais le message « merci pour votre inscription » doit être différent pour chaque site. En utilisant des objets <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>, il est possible d’abstraire le message « merci » afin d’utiliser les valeurs <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site.name\" title=\"django.contrib.sites.models.Site.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">name</span></code></a> et <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site.domain\" title=\"django.contrib.sites.models.Site.domain\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">domain</span></code></a> correspondant au site actuel.</p>\n<p>Voici un exemple qui pourrait constituer le code de gestion du formulaire dans la vue :</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.sites.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_current_site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">send_mail</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">register_for_newsletter</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Check form values, etc., and subscribe the user.</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">get_current_site</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n    <span class=\"n\">send_mail</span><span class=\"p\">(</span>\n        <span class=\"s1\">&#39;Thanks for subscribing to </span><span class=\"si\">%s</span><span class=\"s1\"> alerts&#39;</span> <span class=\"o\">%</span> <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Thanks for your subscription. We appreciate it.</span><span class=\"se\">\\n\\n</span><span class=\"s1\">-The </span><span class=\"si\">%s</span><span class=\"s1\"> team.&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>\n            <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,</span>\n        <span class=\"p\">),</span>\n        <span class=\"s1\">&#39;editor@</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">domain</span><span class=\"p\">,</span>\n        <span class=\"p\">[</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">email</span><span class=\"p\">],</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>Pour Lawrence.com, l’objet du courriel correspond à « Thanks for subscribing to lawrence.com alerts. ». Pour LJWorld.com, l’objet du courriel correspond à « Thanks for subscribing to LJWorld.com alerts. ». De même pour les corps des courriels.</p>\n<p>Notez qu’une manière encore plus souple (mais plus lourde) de faire cela serait d’utiliser le système des gabarits de Django. En supposant que les sites Lawrence.com et LJWorld.com ont des répertoires de gabarits différents (<a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a>), il suffirait de confier la personnalisation des messages au système des gabarits, 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.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">send_mail</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">loader</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">register_for_newsletter</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Check form values, etc., and subscribe the user.</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"n\">subject</span> <span class=\"o\">=</span> <span class=\"n\">loader</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s1\">&#39;alerts/subject.txt&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">({})</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"n\">loader</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s1\">&#39;alerts/message.txt&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">({})</span>\n    <span class=\"n\">send_mail</span><span class=\"p\">(</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"p\">,</span> <span class=\"s1\">&#39;editor@ljworld.com&#39;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">email</span><span class=\"p\">])</span>\n\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>Dans ce cas, il faudrait encore créer les fichiers de gabarit <code class=\"file docutils literal notranslate\"><span class=\"pre\">subject.txt</span></code> et <code class=\"file docutils literal notranslate\"><span class=\"pre\">message.txt</span></code> dans les deux répertoires de gabarits LJWorld.com et Lawrence.com. Cela apporte un maximum de flexibilité, mais est aussi plus complexe.</p>\n<p>Il est recommandé d’exploiter au maximum les objets <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> afin de supprimer de la complexité inutile et de la redondance.</p>\n</section>\n<section id=\"getting-the-current-domain-for-full-urls\">\n<h3>Accès au domaine actuel pour des URL complètes<a class=\"heading-anchor\" href=\"#getting-the-current-domain-for-full-urls\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>La convention <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> de Django est pratique pour obtenir les URL des objets sans le nom de domaine, mais dans certains cas, il peut être souhaitable d’afficher une URL complète d’un objet, avec <code class=\"docutils literal notranslate\"><span class=\"pre\">http://</span></code> et le domaine. Pour cela, vous pouvez utiliser l’infrastructure des sites. Un 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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</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=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">get_absolute_url</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;/mymodel/objects/3/&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">domain</span>\n<span class=\"go\">&#39;example.com&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&#39;https://</span><span class=\"si\">%s%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">domain</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">get_absolute_url</span><span class=\"p\">())</span>\n<span class=\"go\">&#39;https://example.com/mymodel/objects/3/&#39;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"enabling-the-sites-framework\">\n<span id=\"id1\"></span><h2>Activation de l’infrastructure des sites<a class=\"heading-anchor\" href=\"#enabling-the-sites-framework\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour activer l’infrastructure des sites, suivez ces étapes :</p>\n<ol class=\"arabic\">\n<li><p>Ajoutez <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.sites'</span></code> à votre réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p></li>\n<li><p>Définissez un réglage <a class=\"reference internal\" href=\"/fr/3.0/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<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\">SITE_ID</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n</code></pre></div>\n</li>\n<li><p>Exécutez <a class=\"reference internal\" href=\"/fr/3.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>.</p></li>\n</ol>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sites</span></code> inscrit un gestionnaire de signal <a class=\"reference internal\" href=\"/fr/3.0/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> qui crée un site par défaut nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com</span></code> avec le domaine <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com</span></code>. Ce site est aussi créé à la suite de la création de la base de données de test par Django. Pour définir le nom et le domaine corrects pour votre projet, vous pouvez utiliser une <a class=\"reference internal\" href=\"/fr/3.0/topics/migrations/#data-migrations\"><span class=\"std std-ref\">migration de données</span></a>.</p>\n<p>Afin de servir différents sites en production, il s’agit de créer un fichier de réglages différent pour chacun avec un <code class=\"docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code> spécifique (en important peut-être d’un fichier de réglages commun pour éviter de dupliquer les réglages partagés), puis de définir la valeur <span class=\"target\" id=\"index-2\"></span><a class=\"reference internal\" href=\"/fr/3.0/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code></a> appropriée pour chaque site.</p>\n</section>\n<section id=\"caching-the-current-site-object\">\n<h2>Mise en cache de l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Site</span></code> actuel<a class=\"heading-anchor\" href=\"#caching-the-current-site-object\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Comme le site actuel est stocké en base de données, chaque appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">Site.objects.get_current()</span></code> pourrait aboutir à une requête de base de données. Mais Django est un peu plus malin que cela : lors de la première requête, le site actuel est mis en cache et tout appel subséquent à cette méthode renvoie les données en cache plutôt que de recourir à la base de données.</p>\n<p>Si pour une raison quelconque vous souhaitez forcer une nouvelle requête à la base de données, vous pouvez demander à Django d’effacer le contenu en cache en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">Site.objects.clear_cache()</span></code>:</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=\"c1\"># First call; current site fetched from database.</span>\n<span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n<span class=\"c1\"># ...</span>\n\n<span class=\"c1\"># Second call; current site fetched from cache.</span>\n<span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n<span class=\"c1\"># ...</span>\n\n<span class=\"c1\"># Force a database query for the third call.</span>\n<span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">clear_cache</span><span class=\"p\">()</span>\n<span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"the-currentsitemanager\">\n<h2>Le gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code><a class=\"heading-anchor\" href=\"#the-currentsitemanager\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.managers.CurrentSiteManager\">\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\">managers.</span></span><span class=\"sig-name descname\"><span class=\"pre\">CurrentSiteManager</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.managers.CurrentSiteManager\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Si <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> joue un rôle majeur dans votre application, considérer l’utilisation du gestionnaire <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> dans vos modèles. Il s’agit d’un <a class=\"reference internal\" href=\"/fr/3.0/topics/db/managers/\"><span class=\"doc\">gestionnaire</span></a> de modèle qui filtre automatiquement ses requêtes pour n’inclure que les objets associés au <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> actuel.</p>\n<aside class=\"admonition-mandatory-setting-site-id admonition\">\n<p class=\"admonition-title\"><a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> obligatoire</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code> n’est utilisable qu’à la condition que le réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> soit défini dans vos réglages.</p>\n</aside>\n<p>Utilisez <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> en l’ajoutant explicitement à vos modèles. 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.contrib.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sites.managers</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CurrentSiteManager</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Photo</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">photo</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">upload_to</span><span class=\"o\">=</span><span class=\"s1\">&#39;photos&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">photographer_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">site</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Site</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n    <span class=\"n\">on_site</span> <span class=\"o\">=</span> <span class=\"n\">CurrentSiteManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Avec ce modèle, <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo.objects.all()</span></code> renvoie tous les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo</span></code> de la base de données, mais <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo.on_site.all()</span></code> ne renvoie que les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo</span></code> associés au site actuel, en fonction du réglage <a class=\"reference internal\" href=\"/fr/3.0/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>Autrement dit, ces deux instructions sont équivalentes :</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\">Photo</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\">site</span><span class=\"o\">=</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">SITE_ID</span><span class=\"p\">)</span>\n<span class=\"n\">Photo</span><span class=\"o\">.</span><span class=\"n\">on_site</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Comment <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> sait-il quel champ de <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo</span></code> indique le <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>? Par défaut, <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> cherche à filtrer soit selon une clé <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> nommée <code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code>, soit selon un champ <a class=\"reference internal\" href=\"/fr/3.0/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">sites</span></code>. Si vous utilisez un champ nommé différemment de``site`` ou <code class=\"docutils literal notranslate\"><span class=\"pre\">sites</span></code> pour désigner les objets <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> auxquels vos objets sont reliés, il est alors nécessaire de passer explicitement le nom de champ personnalisé comme paramètre à <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> dans le modèle. Le modèle suivant, qui possède un champ nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">publish_on</span></code>, démontre cela :</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sites.managers</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CurrentSiteManager</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Photo</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">photo</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">upload_to</span><span class=\"o\">=</span><span class=\"s1\">&#39;photos&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">photographer_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">publish_on</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Site</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n    <span class=\"n\">on_site</span> <span class=\"o\">=</span> <span class=\"n\">CurrentSiteManager</span><span class=\"p\">(</span><span class=\"s1\">&#39;publish_on&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Si vous essayez d’utiliser <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> et que vous lui indiquez un nom de champ qui n’existe pas, Django génère une exception <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code>.</p>\n<p>Finalement, notez qu’il est recommandé de conserver un <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> normal (non lié aux sites) pour vos modèles, même si vous utilisez <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a>. Comme expliqué dans la <a class=\"reference internal\" href=\"/fr/3.0/topics/db/managers/\"><span class=\"doc\">documentation des gestionnaires</span></a>, si vous définissez manuellement un gestionnaire, Django ne crée pas le gestionnaire automatique <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span> <span class=\"pre\">=</span> <span class=\"pre\">models.Manager()</span></code> à votre place. Sachez également que certaines parties de Django, particulièrement le site d’administration et les vues génériques, utilisent le <em>premier</em> gestionnaire défini pour un modèle, donc si vous voulez que le site d’administration puisse accéder à tous les objets (et pas seulement ceux d’un site particulier), ajoutez <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span> <span class=\"pre\">=</span> <span class=\"pre\">models.Manager()</span></code> dans vos modèles avant de définir <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a>.</p>\n</section>\n<section id=\"site-middleware\">\n<span id=\"id2\"></span><h2>Intergiciel de site<a class=\"heading-anchor\" href=\"#site-middleware\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Si vous utilisez fréquemment ce motif :</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Pour éviter les répétitions, ajoutez <a class=\"reference internal\" href=\"/fr/3.0/ref/middleware/#django.contrib.sites.middleware.CurrentSiteMiddleware\" title=\"django.contrib.sites.middleware.CurrentSiteMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.sites.middleware.CurrentSiteMiddleware</span></code></a> à <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>. Cet intergiciel définit l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code> pour chaque objet de requête, ce qui permet d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">request.site</span></code> pour accéder au site actuel.</p>\n</section>\n<section id=\"how-django-uses-the-sites-framework\">\n<h2>Utilisation de l’infrastructure des sites par Django<a class=\"heading-anchor\" href=\"#how-django-uses-the-sites-framework\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Même s’il n’est pas obligatoire d’utiliser l’infrastructure des sites, elle est fortement encouragée car Django en tire profit à plusieurs endroits. Même si votre installation de Django n’est utilisée que par un seul site, prenez les quelques secondes nécessaires à la définition de l’objet site avec les bonnes valeurs <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, puis faites pointer le réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> vers l’identifiant de cet objet.</p>\n<p>Voici comment Django utilise l’infrastructure des sites :</p>\n<ul class=\"simple\">\n<li><p>Dans l”<a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/redirects/#module-django.contrib.redirects\" title=\"django.contrib.redirects: A framework for managing redirects.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">application</span> <span class=\"pre\">de</span> <span class=\"pre\">redirection</span></code></a>, chaque objet de redirection est associé à un site particulier. Lorsque Django recherche une redirection, il prend en compte le site actuel.</p></li>\n<li><p>Dans l”<a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/flatpages/#module-django.contrib.flatpages\" title=\"django.contrib.flatpages: A framework for managing simple ?flat? HTML content in a database.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">application</span> <span class=\"pre\">des</span> <span class=\"pre\">pages</span> <span class=\"pre\">statiques</span></code></a>, chaque page statique est associée à un site particulier. Lorsqu’une page statique est créée, il faut indiquer le <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>, et l’intergiciel <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/flatpages/#django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\" title=\"django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FlatpageFallbackMiddleware</span></code></a> vérifie le site actuel lorsqu’il recherche des pages statiques à afficher.</p></li>\n<li><p>Dans l”<a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/syndication/#module-django.contrib.syndication\" title=\"django.contrib.syndication: A framework for generating syndication feeds, in RSS and Atom, quite easily.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">infrastructure</span> <span class=\"pre\">de</span> <span class=\"pre\">syndication</span></code></a>, les gabarits pour <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> ont automatiquement accès à une variable <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site</span> <span class=\"pre\">}}</span></code>, qui est l’objet <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> représentant le site actuel. De même, le point d’entrée pour fournir les URL des éléments utilisent l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> de l’objet <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> actuel si vous n’indiquez pas un domaine pleinement qualifié.</p></li>\n<li><p>Dans l”<a class=\"reference internal\" href=\"/fr/3.0/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">infrastructure</span> <span class=\"pre\">d'authentification</span></code></a>, la vue <a class=\"reference internal\" href=\"/fr/3.0/topics/auth/default/#django.contrib.auth.views.LoginView\" title=\"django.contrib.auth.views.LoginView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.views.LoginView</span></code></a> passe le nom de l’objet <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> actuel au gabarit sous forme de <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site_name</span> <span class=\"pre\">}}</span></code>.</p></li>\n<li><p>La vue de raccourci (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes.views.shortcut</span></code>) utilise le domaine de l’objet <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> actuel lors de la construction de l’URL d’un objet.</p></li>\n<li><p>Dans le site d’administration, le lien « voir sur le site » utilise l’objet <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> actuel pour connaître le domaine du site vers lequel la redirection s’opère.</p></li>\n</ul>\n</section>\n<section id=\"requestsite-objects\">\n<h2>Les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code><a class=\"heading-anchor\" href=\"#requestsite-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p id=\"id3\">Certaines applications <a class=\"reference internal\" href=\"/fr/3.0/ref/contrib/\"><span class=\"doc\">django.contrib</span></a> s’appuient sur l’infrastructure des sites mais sont conçues pour ne pas <em>dépendre</em> de l’installation de l’application sites dans la base de données. (Certaines personnes ne souhaitent pas ou n’ont simplement pas la <em>possibilité</em> d’installer la table de base de données supplémentaire que demande l’infrastructure des sites.) Pour ces situations, l’application fournit une classe <a class=\"reference internal\" href=\"#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.sites.requests.RequestSite</span></code></a> qui peut être utilisée comme solution de repli lorsque le complément en base de données de l’infrastructure des sites n’est pas disponible.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.requests.RequestSite\">\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\">requests.</span></span><span class=\"sig-name descname\"><span class=\"pre\">RequestSite</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.requests.RequestSite\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Une classe qui partage l’interface principale de <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> (c’est-à-dire qu’elle possède les attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>), mais qui reçoit ses données à partir d’un objet <a class=\"reference internal\" href=\"/fr/3.0/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> de Django plutôt qu’à partir de la base de données.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.requests.RequestSite.__init__\">\n<span class=\"sig-name descname\"><span class=\"pre\">__init__</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sites.requests.RequestSite.__init__\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Définit les attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> selon les valeurs obtenues de <a class=\"reference internal\" href=\"/fr/3.0/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_host()</span></code></a>.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Un objet <a class=\"reference internal\" href=\"#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> possède une interface similaire à un objet <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> normal, sauf que sa méthode <a class=\"reference internal\" href=\"#django.contrib.sites.requests.RequestSite.__init__\" title=\"django.contrib.sites.requests.RequestSite.__init__\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__init__()</span></code></a> accepte un objet <a class=\"reference internal\" href=\"/fr/3.0/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>. Il est capable d’en déduire le domaine et le nom en examinant le domaine de la requête. Il possède des méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> pour refléter l’interface de <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>, mais ces méthodes générent l’exception <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#NotImplementedError\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">NotImplementedError</span></code></a>.</p>\n</section>\n<section id=\"get-current-site-shortcut\">\n<h2>Le raccourci <code class=\"docutils literal notranslate\"><span class=\"pre\">get_current_site</span></code><a class=\"heading-anchor\" href=\"#get-current-site-shortcut\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Finalement, pour éviter du code redondant, le système fournit une fonction <a class=\"reference internal\" href=\"#django.contrib.sites.shortcuts.get_current_site\" title=\"django.contrib.sites.shortcuts.get_current_site\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.sites.shortcuts.get_current_site()</span></code></a>.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.shortcuts.get_current_site\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">shortcuts.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_current_site</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sites.shortcuts.get_current_site\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Une fonction qui vérifie si <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sites</span></code> est installé et qui renvoie soit l’objet <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> en cours, soit un objet <a class=\"reference internal\" href=\"#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> défini à partir de la requête. Il détermine le site actuel sur la base de <a class=\"reference internal\" href=\"/fr/3.0/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code></a> si le réglage <a class=\"reference internal\" href=\"/fr/3.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> n’est pas défini.</p>\n<p><a class=\"reference internal\" href=\"/fr/3.0/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code></a> peut renvoyer à la fois un domaine et un port lorsque l’en-tête <code class=\"docutils literal notranslate\"><span class=\"pre\">Host</span></code> contient un numéro de port explicite, par exemple <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com:80</span></code>. Dans de tels cas, si la recherche échoue parce que l’hôte ne correspond pas à un enregistrement dans la base de données, le port est enlevé et la recherche est relancée uniquement avec la partie du domaine. Ceci ne concerne pas <a class=\"reference internal\" href=\"#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> qui utilise toujours l’hôte non modifié.</p>\n</dd></dl>\n\n</section>","rootId":"module-django.contrib.sites","toc":[{"title":"Exemple d’utilisation","anchor":"example-usage","children":[{"title":"Association de contenu à plusieurs sites différents","anchor":"associating-content-with-multiple-sites","children":[]},{"title":"Association de contenu à un seul site","anchor":"associating-content-with-a-single-site","children":[]},{"title":"Interception du site actuel dans les vues","anchor":"hooking-into-the-current-site-from-views","children":[]},{"title":"Accès au domaine actuel pour l’affichage","anchor":"getting-the-current-domain-for-display","children":[]},{"title":"Accès au domaine actuel pour des URL complètes","anchor":"getting-the-current-domain-for-full-urls","children":[]}]},{"title":"Activation de l’infrastructure des sites","anchor":"enabling-the-sites-framework","children":[]},{"title":"Mise en cache de l’objet Site actuel","anchor":"caching-the-current-site-object","children":[]},{"title":"Le gestionnaire CurrentSiteManager","anchor":"the-currentsitemanager","children":[]},{"title":"Intergiciel de site","anchor":"site-middleware","children":[]},{"title":"Utilisation de l’infrastructure des sites par Django","anchor":"how-django-uses-the-sites-framework","children":[]},{"title":"Les objets RequestSite","anchor":"requestsite-objects","children":[]},{"title":"Le raccourci get_current_site","anchor":"get-current-site-shortcut","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/3.0/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/3.0/ref/contrib/"}],"prev":{"docname":"ref/contrib/sitemaps","title":"Le système des plans de site (sitemap)","url":"/fr/3.0/ref/contrib/sitemaps/"},"next":{"docname":"ref/contrib/staticfiles","title":"L’application de gestion des fichiers statiques (staticfiles)","url":"/fr/3.0/ref/contrib/staticfiles/"},"formats":{"html":"/fr/3.0/ref/contrib/sites/","markdown":"/fr/3.0/ref/contrib/sites.md","json":"/fr/3.0/ref/contrib/sites.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/ref/contrib/sites.txt","official":"https://docs.djangoproject.com/fr/3.0/ref/contrib/sites/","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"]}