{"title":"L’application flatpages (pages statiques)","version":"5.0","locale":"fr","docname":"ref/contrib/flatpages","url":"/fr/5.0/ref/contrib/flatpages/","canonical":"https://djangodocs.dev/fr/5.0/ref/contrib/flatpages/","summary":"Django est livré avec une application « flatpages » facultative. Elle permet de stocker du contenu HTML « à plat » dans la base de données et d’en assurer la…","html":"<span id=\"the-flatpages-app\"></span><h1>L’application flatpages (pages statiques)<a class=\"heading-anchor\" href=\"#module-django.contrib.flatpages\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django est livré avec une application « flatpages » facultative. Elle permet de stocker du contenu HTML « à plat » dans la base de données et d’en assurer la gestion pour vous via l’interface d’administration de Django et une API Python.</p>\n<p>Une flatpage (littéralement « page plate ») est un objet avec une URL, un titre et un contenu. Ces pages sont utiles pour des pages spéciales à usage unique, telles que les pages « À propos » ou « Politique de confidentialité » que vous souhaitez stocker dans une base de données mais pour lesquelles vous ne voulez pas développer une application Django dédiée.</p>\n<p>Une flatpage peut utiliser un gabarit personnalisé ou un gabarit de flatpage par défaut pour l’ensemble du système. Elle peut être associés à un ou plusieurs sites.</p>\n<p>Le champ de contenu peut éventuellement être laissé vierge si vous préférez placer le contenu dans un gabarit personnalisé.</p>\n<section id=\"installation\">\n<h2>Installation<a class=\"heading-anchor\" href=\"#installation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour installer l’application flatpages, procédez comme suit :</p>\n<ol class=\"arabic\">\n<li><p>Installez le <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/sites/#module-django.contrib.sites\" title=\"django.contrib.sites: Lets you operate multiple websites from the same database and Django project\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">gestionnaire</span> <span class=\"pre\">de</span> <span class=\"pre\">sites</span></code></a> en ajoutant <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.sites'</span></code> à votre réglage <a class=\"reference internal\" href=\"/fr/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, si ce n’est déjà fait.</p>\n<p>Assurez-vous également d’avoir correctement configuré <a class=\"reference internal\" href=\"/fr/5.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> avec l’identifiant du site que le fichier de réglages représente. C’est généralement <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> (c’est-à-dire <code class=\"docutils literal notranslate\"><span class=\"pre\">SITE_ID</span> <span class=\"pre\">=</span> <span class=\"pre\">1</span></code>, mais si vous utilisez le gestionnaire de sites pour gérer plusieurs sites, ce pourrait être l’identifiant d’un autre site.</p>\n</li>\n<li><p>Ajoutez <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.flatpages'</span></code> au réglage <a class=\"reference internal\" href=\"/fr/5.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</ol>\n<p>Puis, au choix :</p>\n<ol class=\"arabic\" start=\"3\">\n<li><p>Ajoutez une entrée dans votre configuration d’URL. 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=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;pages/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django.contrib.flatpages.urls&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n</ol>\n<p>ou :</p>\n<ol class=\"arabic simple\" start=\"3\">\n<li><p>Ajoutez <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'</span></code> au réglage <a class=\"reference internal\" href=\"/fr/5.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>.</p></li>\n<li><p>Lancez la commande <a class=\"reference internal\" href=\"/fr/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code></a>.</p></li>\n</ol>\n</section>\n<section id=\"how-it-works\">\n<h2>Fonctionnement<a class=\"heading-anchor\" href=\"#how-it-works\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code> crée deux tables dans votre base de données : <code class=\"docutils literal notranslate\"><span class=\"pre\">django_flatpage</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">django_flatpage_sites</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">django_flatpage</span></code> est une table de correspondance qui associe une URL à un titre et un champ de contenu textuel. <code class=\"docutils literal notranslate\"><span class=\"pre\">django_flatpage_sites</span></code> associe une flatpage à un site.</p>\n<section id=\"using-the-urlconf\">\n<h3>Utilisation de la configuration d’URL<a class=\"heading-anchor\" href=\"#using-the-urlconf\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Il y a plusieurs façons d’inclure les pages statiques dans la configuration d’URL. Vous pouvez dédier un chemin particulier pour les pages statiques :</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\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;pages/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django.contrib.flatpages.urls&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Vous pouvez également le configurer comme un motif « fourre-tout ». Dans ce cas, il est important de placer le motif à la fin des autres <code class=\"docutils literal notranslate\"><span class=\"pre\">urlpatterns</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.flatpages</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span>\n\n<span class=\"c1\"># Your other patterns here</span>\n<span class=\"n\">urlpatterns</span> <span class=\"o\">+=</span> <span class=\"p\">[</span>\n    <span class=\"n\">re_path</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s2\">&quot;^(?P&lt;url&gt;.*/)$&quot;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">flatpage</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Si vous définissez <a class=\"reference internal\" href=\"/fr/5.0/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, vous devez supprimer la barre oblique dans le motif fourre-tout, sinon les flatpages sans barre oblique finale ne seront pas identifiées.</p>\n</aside>\n<p>Une autre configuration courante consiste à utiliser des pages statiques pour un nombre limité de pages connues à l’avance et à figer leurs URL, afin de pouvoir y faire référence avec la balise de gabarit <a class=\"reference internal\" href=\"/fr/5.0/ref/templates/builtins/#std-templatetag-url\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">url</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.flatpages</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">+=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;about-us/&quot;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">flatpage</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;url&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/about-us/&quot;</span><span class=\"p\">},</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;about&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;license/&quot;</span><span class=\"p\">,</span> <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">flatpage</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;url&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/license/&quot;</span><span class=\"p\">},</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;license&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</section>\n<section id=\"using-the-middleware\">\n<h3>Utilisation de l’intergiciel<a class=\"heading-anchor\" href=\"#using-the-middleware\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’intergiciel <a class=\"reference internal\" href=\"#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> peut se charger de tout le travail.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">FlatpageFallbackMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Chaque fois qu’une application Django génère une erreur 404, cet intergiciel vérifie si la base de données flatpages contient l’URL demandée en dernier recours. Plus précisément, il recherche une flatpage avec l’URL donnée et avec un identifiant de site qui correspond au réglage <a class=\"reference internal\" href=\"/fr/5.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>S’il trouve une correspondance, il suit cet algorithme :</p>\n<ul class=\"simple\">\n<li><p>Si la flatpage a un gabarit personnalisé, il charge ce gabarit. Sinon, il charge le gabarit <code class=\"file docutils literal notranslate\"><span class=\"pre\">flatpages/default.html</span></code>.</p></li>\n<li><p>Il transmet à ce gabarit une variable unique de contexte, <code class=\"docutils literal notranslate\"><span class=\"pre\">flatpage</span></code>, qui est l’objet flatpage. Il utilise <a class=\"reference internal\" href=\"/fr/5.0/ref/templates/api/#django.template.RequestContext\" title=\"django.template.RequestContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code></a> dans le rendu du gabarit.</p></li>\n</ul>\n<p>L’intergiciel ne fera qu’ajouter une barre oblique finale et rediriger (en fonction du réglage <a class=\"reference internal\" href=\"/fr/5.0/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a>) si l’URL résultante se réfère à une flatpage valide. Les redirections sont permanentes (code 301).</p>\n<p>Si aucune correspondance n’est trouvée, le traitement de la requête continue normalement.</p>\n<p>L’intergiciel ne s’active que pour les erreurs 404 – pas pour les erreurs 500 ni les réponses ayant un autre code de statut.</p>\n</dd></dl>\n\n<aside class=\"admonition-flatpages-will-not-apply-view-middleware admonition\">\n<p class=\"admonition-title\">Les flatpages n’appliquent pas d’intergiciel de vue</p>\n<p>Comme l’intergiciel <code class=\"docutils literal notranslate\"><span class=\"pre\">FlatpageFallbackMiddleware</span></code> n’est appliqué qu’après l’échec de la résolution de l’URL et la production d’une erreur 404, la réponse qu’il renvoie n’applique aucune des méthodes <a class=\"reference internal\" href=\"/fr/5.0/topics/http/middleware/#view-middleware\"><span class=\"std std-ref\">d’intergiciel de vue</span></a>. Seules les requêtes qui sont routées avec succès vers une vue par la résolution normale de l’URL appliquent les intergiciels de vue.</p>\n</aside>\n<p>Notez que l’ordre de <a class=\"reference internal\" href=\"/fr/5.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> est important. Généralement, vous pouvez mettre <a class=\"reference internal\" href=\"#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> à la fin de la liste. Cela signifie qu’il s’exécutera en premier lors du traitement de la réponse et garantira que tout autre intergiciel qui traite la réponse voit la réponse de la flatpage plutôt que la 404.</p>\n<p>Pour plus d’informations sur cet intergiciel, lisez la <a class=\"reference internal\" href=\"/fr/5.0/topics/http/middleware/\"><span class=\"doc\">documentation des intergiciels</span></a>.</p>\n<aside class=\"admonition-ensure-that-your-404-template-works admonition\">\n<p class=\"admonition-title\">Le gabarit 404 doit fonctionner</p>\n<p>Notez que <a class=\"reference internal\" href=\"#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> n’entre en jeu qu’une fois qu’une autre vue a réussi à produire une réponse 404. Si une autre vue ou une autre classe d’intergiciel tente de produire une réponse 404 mais finit par générer une exception à la place, la réponse devient HTTP 500 (« Erreur interne du serveur ») et <a class=\"reference internal\" href=\"#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> ne tentera pas de servir une page statique.</p>\n</aside>\n</section>\n</section>\n<section id=\"how-to-add-change-and-delete-flatpages\">\n<h2>Comment ajouter, modifier et supprimer des flatpages<a class=\"heading-anchor\" href=\"#how-to-add-change-and-delete-flatpages\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Les permissions d’ajouter et de modifier des pages «flatpages» devraient être restreintes à des utilisateurs de confiance. Le contenu de ces pages est en HTML brut et <strong>n’est pas contrôlé</strong> par Django. Par conséquent, une de ces pages au contenu malveillant peut conduire à diverses vulnérabilités de sécurité, y compris l’escalade de permissions.</p>\n</aside>\n<section id=\"via-the-admin-interface\">\n<span id=\"flatpages-admin\"></span><h3>Via l’interface d’administration<a class=\"heading-anchor\" href=\"#via-the-admin-interface\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous avez activé l’interface d’administration automatique de Django, vous devriez voir une section « Flatpages » sur la page d’accueil de l’administration. Les flatpages sont éditables comme pour n’importe quel autre objet du système.</p>\n<p>Le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">FlatPage</span></code> possède un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">enable_comments</span></code> qui n’est pas exploité par <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.flatpages</span></code>, mais il pourrait être utile pour votre projet ou des applications tierces. Il n’apparaît pas dans l’interface d’administration, mais vous pouvez l’ajouter en inscrivant un <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> personnalisé pour <code class=\"docutils literal notranslate\"><span class=\"pre\">FlatPage</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</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.flatpages.admin</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FlatPageAdmin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.flatpages.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FlatPage</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"c1\"># Define a new FlatPageAdmin</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FlatPageAdmin</span><span class=\"p\">(</span><span class=\"n\">FlatPageAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fieldsets</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;url&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;title&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;content&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;sites&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span>\n            <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Advanced options&quot;</span><span class=\"p\">),</span>\n            <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;collapse&quot;</span><span class=\"p\">],</span>\n                <span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n                    <span class=\"s2\">&quot;enable_comments&quot;</span><span class=\"p\">,</span>\n                    <span class=\"s2\">&quot;registration_required&quot;</span><span class=\"p\">,</span>\n                    <span class=\"s2\">&quot;template_name&quot;</span><span class=\"p\">,</span>\n                <span class=\"p\">],</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n\n<span class=\"c1\"># Re-register FlatPageAdmin</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">unregister</span><span class=\"p\">(</span><span class=\"n\">FlatPage</span><span class=\"p\">)</span>\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">FlatPage</span><span class=\"p\">,</span> <span class=\"n\">FlatPageAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"via-the-python-api\">\n<h3>Via l’API Python<a class=\"heading-anchor\" href=\"#via-the-python-api\"><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.flatpages.models.FlatPage\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">FlatPage</span></span><a class=\"heading-anchor\" href=\"#django.contrib.flatpages.models.FlatPage\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Les flatpages sont représentées par un <a class=\"reference internal\" href=\"/fr/5.0/topics/db/models/\"><span class=\"doc\">modèle Django</span></a> standard défini dans <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.0.x/django/contrib/flatpages/models.py\">django/contrib/flatpages/models.py</a>. Vous pouvez accéder aux objets flatpage via l’<a class=\"reference internal\" href=\"/fr/5.0/topics/db/queries/\"><span class=\"doc\">API de base de données de Django</span></a>.</p>\n</dd></dl>\n\n<aside class=\"admonition-check-for-duplicate-flatpage-urls admonition\">\n<p class=\"admonition-title\">Éviter les doublons d’URL de flatpages</p>\n<p>Si vous ajoutez ou modifiez les flatpages via votre propre code, il est souhaitable d’éviter des URL définies en double pour un même site. Le formulaire de flatpage utilisé dans l’interface d’administration effectue ce contrôle de validation et peut être importé depuis <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.flatpages.forms.FlatpageForm</span></code> et être utilisé dans vos propres vues.</p>\n</aside>\n</section>\n</section>\n<section id=\"flatpage-templates\">\n<h2>Gabarits de flatpage<a class=\"heading-anchor\" href=\"#flatpage-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Par défaut, les flatpages sont rendues par le gabarit <code class=\"file docutils literal notranslate\"><span class=\"pre\">flatpages/default.html</span></code>, mais vous pouvez le remplacer pour une flatpage donnée : dans l’interface d’administration, une section refermée et intitulée « Options avancées » (un clic l’ouvrira) contient un champ pour définir un nom de gabarit. Si vous créez une page statique via l’API Python, vous pouvez définir le nom du gabarit via le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> de l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">FlatPage</span></code>.</p>\n<p>La création du gabarit <code class=\"file docutils literal notranslate\"><span class=\"pre\">flatpages/default.html</span></code> est de votre responsabilité ; dans votre répertoire de gabarits, créez un répertoire <code class=\"file docutils literal notranslate\"><span class=\"pre\">flatpages</span></code> contenant un fichier <code class=\"file docutils literal notranslate\"><span class=\"pre\">default.html</span></code>.</p>\n<p>Les gabarits de flatpage ne reçoivent qu’une seule variable de contexte, <code class=\"docutils literal notranslate\"><span class=\"pre\">flatpage</span></code>, qui correspond à l’objet flatpage.</p>\n<p>Voici un exemple de gabarit <code class=\"file docutils literal notranslate\"><span class=\"pre\">flatpages/default.html</span></code>:</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\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">flatpage.title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">head</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{{</span> <span class=\"nv\">flatpage.content</span> <span class=\"cp\">}}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">body</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Puisqu’il est possible de saisir du contenu HTML brut dans la page d’administration d’une flatpage, <code class=\"docutils literal notranslate\"><span class=\"pre\">flatpage.title</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">flatpage.content</span></code> sont tous deux marqués comme ne requérant <strong>pas</strong> <a class=\"reference internal\" href=\"/fr/5.0/ref/templates/language/#automatic-html-escaping\"><span class=\"std std-ref\">d’échappement HTML automatique</span></a> dans le gabarit.</p>\n</section>\n<section id=\"getting-a-list-of-flatpage-objects-in-your-templates\">\n<h2>Obtention d’une liste d’objets <a class=\"reference internal\" href=\"#django.contrib.flatpages.models.FlatPage\" title=\"django.contrib.flatpages.models.FlatPage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FlatPage</span></code></a> dans un gabarit<a class=\"heading-anchor\" href=\"#getting-a-list-of-flatpage-objects-in-your-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>L’application flatpages fournit une balise de gabarit permettant de parcourir l’ensemble des flatpages disponibles pour le <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/sites/#hooking-into-current-site-from-views\"><span class=\"std std-ref\">site actuel</span></a>.</p>\n<p>Comme pour toute balise de gabarit personnalisée, il est nécessaire de <a class=\"reference internal\" href=\"/fr/5.0/ref/templates/language/#loading-custom-template-libraries\"><span class=\"std std-ref\">charger sa bibliothèque de balises personnalisées</span></a> avant de pouvoir l’utiliser. Après le chargement de la bibliothèque, vous pouvez récupérer toutes les flatpages actuelles via la balise <a class=\"reference internal\" href=\"#std-templatetag-get_flatpages\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">get_flatpages</span></code></a>:</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=\"k\">load</span> <span class=\"nv\">flatpages</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">get_flatpages</span> <span class=\"k\">as</span> <span class=\"nv\">flatpages</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">page</span> <span class=\"k\">in</span> <span class=\"nv\">flatpages</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">page.url</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">page.title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<section id=\"displaying-registration-required-flatpages\">\n<span id=\"std-templatetag-get_flatpages\"></span><h3>Affichage des flatpages avec <code class=\"docutils literal notranslate\"><span class=\"pre\">registration_required</span></code> (connexion requise)<a class=\"heading-anchor\" href=\"#displaying-registration-required-flatpages\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Par défaut, la balise de gabarit <a class=\"reference internal\" href=\"#std-templatetag-get_flatpages\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">get_flatpages</span></code></a> n’affiche que les flatpages dont le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">registration_required</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code>. Si vous souhaitez afficher les flatpages limitées aux utilisateurs connectés, vous devez indiquer un utilisateur authentifié en utilisant une clause <code class=\"docutils literal notranslate\"><span class=\"pre\">for</span></code>.</p>\n<p>Par exemple :</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=\"k\">get_flatpages</span> <span class=\"nv\">for</span> <span class=\"nv\">someuser</span> <span class=\"k\">as</span> <span class=\"nv\">about_pages</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Si vous indiquez un utilisateur anonyme, <a class=\"reference internal\" href=\"#std-templatetag-get_flatpages\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">get_flatpages</span></code></a> se comporte comme si vous n’aviez pas indiqué d’utilisateur, c’est-à-dire qu’elle ne montre que les flatpages publiques.</p>\n</section>\n<section id=\"limiting-flatpages-by-base-url\">\n<h3>Filtrage des flatpages selon une URL de base<a class=\"heading-anchor\" href=\"#limiting-flatpages-by-base-url\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Un paramètre facultatif, <code class=\"docutils literal notranslate\"><span class=\"pre\">starts_with</span></code>, peut être appliqué pour limiter les pages affichées à celles qui commencent par une URL de base particulière. Ce paramètre peut être transmis sous forme de chaîne ou comme variable à résoudre par le contexte.</p>\n<p>Par exemple :</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=\"k\">get_flatpages</span> <span class=\"s1\">&#39;/about/&#39;</span> <span class=\"k\">as</span> <span class=\"nv\">about_pages</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">get_flatpages</span> <span class=\"nv\">about_prefix</span> <span class=\"k\">as</span> <span class=\"nv\">about_pages</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">get_flatpages</span> <span class=\"s1\">&#39;/about/&#39;</span> <span class=\"nv\">for</span> <span class=\"nv\">someuser</span> <span class=\"k\">as</span> <span class=\"nv\">about_pages</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"integrating-with-django-contrib-sitemaps\">\n<h2>Intégration avec <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/sitemaps/#module-django.contrib.sitemaps\" title=\"django.contrib.sitemaps: A framework for generating Google sitemap XML files.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.sitemaps</span></code></a><a class=\"heading-anchor\" href=\"#integrating-with-django-contrib-sitemaps\"><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.flatpages.sitemaps.FlatPageSitemap\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">FlatPageSitemap</span></span><a class=\"heading-anchor\" href=\"#django.contrib.flatpages.sitemaps.FlatPageSitemap\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>La classe <a class=\"reference internal\" href=\"#django.contrib.flatpages.sitemaps.FlatPageSitemap\" title=\"django.contrib.flatpages.sitemaps.FlatPageSitemap\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">sitemaps.FlatPageSitemap</span></code></a> regarde toutes les <a class=\"reference internal\" href=\"#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\">flatpages</span></code></a> publiquement visibles définies pour le <a class=\"reference internal\" href=\"/fr/5.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> courant (voir la <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/sites/#module-django.contrib.sites\" title=\"django.contrib.sites: Lets you operate multiple websites from the same database and Django project\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">documentation</span> <span class=\"pre\">des</span> <span class=\"pre\">«</span> <span class=\"pre\">sites</span> <span class=\"pre\">»</span></code></a>) et crée une entrée dans le plan du site. Ces entrées incluent uniquement l’attribut <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap.location\" title=\"django.contrib.sitemaps.Sitemap.location\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">location</span></code></a> – et pas <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap.lastmod\" title=\"django.contrib.sitemaps.Sitemap.lastmod\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">lastmod</span></code></a>, <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap.changefreq\" title=\"django.contrib.sitemaps.Sitemap.changefreq\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">changefreq</span></code></a> ou <a class=\"reference internal\" href=\"/fr/5.0/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap.priority\" title=\"django.contrib.sitemaps.Sitemap.priority\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">priority</span></code></a>.</p>\n</dd></dl>\n\n<section id=\"example\">\n<h3>Exemple<a class=\"heading-anchor\" href=\"#example\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Voici un exemple de configuration d’URL utilisant <a class=\"reference internal\" href=\"#django.contrib.flatpages.sitemaps.FlatPageSitemap\" title=\"django.contrib.flatpages.sitemaps.FlatPageSitemap\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FlatPageSitemap</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.flatpages.sitemaps</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FlatPageSitemap</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sitemaps.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">sitemap</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\">path</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"c1\"># the sitemap</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;sitemap.xml&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">sitemap</span><span class=\"p\">,</span>\n        <span class=\"p\">{</span><span class=\"s2\">&quot;sitemaps&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;flatpages&quot;</span><span class=\"p\">:</span> <span class=\"n\">FlatPageSitemap</span><span class=\"p\">}},</span>\n        <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;django.contrib.sitemaps.views.sitemap&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</section>\n</section>","rootId":"module-django.contrib.flatpages","toc":[{"title":"Installation","anchor":"installation","children":[]},{"title":"Fonctionnement","anchor":"how-it-works","children":[{"title":"Utilisation de la configuration d’URL","anchor":"using-the-urlconf","children":[]},{"title":"Utilisation de l’intergiciel","anchor":"using-the-middleware","children":[]}]},{"title":"Comment ajouter, modifier et supprimer des flatpages","anchor":"how-to-add-change-and-delete-flatpages","children":[{"title":"Via l’interface d’administration","anchor":"via-the-admin-interface","children":[]},{"title":"Via l’API Python","anchor":"via-the-python-api","children":[]}]},{"title":"Gabarits de flatpage","anchor":"flatpage-templates","children":[]},{"title":"Obtention d’une liste d’objets FlatPage dans un gabarit","anchor":"getting-a-list-of-flatpage-objects-in-your-templates","children":[{"title":"Affichage des flatpages avec registration_required (connexion requise)","anchor":"displaying-registration-required-flatpages","children":[]},{"title":"Filtrage des flatpages selon une URL de base","anchor":"limiting-flatpages-by-base-url","children":[]}]},{"title":"Intégration avec django.contrib.sitemaps","anchor":"integrating-with-django-contrib-sitemaps","children":[{"title":"Exemple","anchor":"example","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/5.0/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/5.0/ref/contrib/"}],"prev":{"docname":"ref/contrib/contenttypes","title":"L’infrastructure des types de contenus (contenttypes)","url":"/fr/5.0/ref/contrib/contenttypes/"},"next":{"docname":"ref/contrib/gis/index","title":"GeoDjango","url":"/fr/5.0/ref/contrib/gis/"},"formats":{"html":"/fr/5.0/ref/contrib/flatpages/","markdown":"/fr/5.0/ref/contrib/flatpages.md","json":"/fr/5.0/ref/contrib/flatpages.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/ref/contrib/flatpages.txt","official":"https://docs.djangoproject.com/fr/5.0/ref/contrib/flatpages/","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","it","pt-br","ko","es","el","pl"]}