{"title":"Écriture de votre première application Django, 7ème partie","version":"6.1","locale":"fr","docname":"intro/tutorial07","url":"/fr/6.1/intro/tutorial07/","canonical":"https://djangodocs.dev/fr/6.1/intro/tutorial07/","summary":"Ce tutoriel commence là où le tutoriel 6 s’achève. Nous continuons l’application de sondage Web et allons nous focaliser sur la personnalisation du site…","html":"<h1>Écriture de votre première application Django, 7ème partie<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-7\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ce tutoriel commence là où le <a class=\"reference internal\" href=\"/fr/6.1/intro/tutorial06/\"><span class=\"doc\">tutoriel 6</span></a> s’achève. Nous continuons l’application de sondage Web et allons nous focaliser sur la personnalisation du site d’administration généré automatiquement par Django, que nous avons déjà exploré dans le <a class=\"reference internal\" href=\"/fr/6.1/intro/tutorial02/\"><span class=\"doc\">tutoriel 2</span></a>.</p>\n<aside class=\"admonition-where-to-get-help admonition\">\n<p class=\"admonition-title\">Où obtenir de l’aide :</p>\n<p>Si vous rencontrez des problèmes dans le parcours de ce tutoriel, rendez-vous dans la section <a class=\"reference internal\" href=\"/fr/6.1/faq/help/\"><span class=\"doc\">Obtenir de l’aide</span></a> de la FAQ.</p>\n</aside>\n<section id=\"customize-the-admin-form\">\n<h2>Personnalisation du formulaire d’administration<a class=\"heading-anchor\" href=\"#customize-the-admin-form\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Quand vous avez inscrit le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> avec <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register(Question)</span></code>, Django a été capable de représenter l’objet dans un formulaire par défaut. Il sera cependant souvent souhaitable de personnaliser l’affichage et le comportement du formulaire. Cela se fait en indiquant certaines options à Django lors de l’inscription de l’objet.</p>\n<p>Voyons comment cela fonctionne, en réordonnant les champs sur le formulaire d’édition. Remplacez la ligne <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register(Question)</span></code> par :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python 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\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]</span>\n\n\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\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Vous suivrez cette méthode – c’est-à-dire créer une classe d’administration de modèle, puis le transmettre en tant que deuxième paramètre de <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register()</span></code> – à chaque fois que vous aurez besoin de modifier les options d’administration pour un modèle.</p>\n<p>Cette modification fait que la « Date de publication » apparaît avant le champ « Question » :</p>\n<img alt=\"Les champs ont été triés \" src=\"/fr/6.1/_images/admin07.png\" />\n<p>Ce n’est pas spécialement impressionnant avec seulement deux champs, mais pour un formulaire d’administration avec des dizaines de champs, choisir un ordre intuitif est un détail d’utilisation important.</p>\n<p>Et en parlant de formulaires avec des dizaines de champs, il peut être utile de partager le formulaire en plusieurs sous-ensembles (fieldsets) :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python 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\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</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;question_text&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Date information&quot;</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;pub_date&quot;</span><span class=\"p\">]}),</span>\n    <span class=\"p\">]</span>\n\n\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\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Le premier élément de chaque tuple dans <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets\" title=\"django.contrib.admin.ModelAdmin.fieldsets\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">fieldsets</span></code></a> est le titre du groupe de champs. Voici ce à quoi notre formulaire ressemble à présent :</p>\n<img alt=\"Le formulaire possède maintenant un jeu de formulaires\" src=\"/fr/6.1/_images/admin08t.png\" />\n</section>\n<section id=\"adding-related-objects\">\n<h2>Ajout d’objets liés<a class=\"heading-anchor\" href=\"#adding-related-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>OK, nous avons notre page d’administration des questions. Mais une <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> possède plusieurs choix <code class=\"docutils literal notranslate\"><span class=\"pre\">Choices</span></code>, et la page d’administration n’affiche aucun choix.</p>\n<p>Pour le moment.</p>\n<p>Il y a deux façons de résoudre ce problème. La première est d’inscrire <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> dans l’administration, comme nous l’avons fait pour <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python 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\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n<span class=\"c1\"># ...</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\">Choice</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Maintenant les choix « Choices » sont une option disponible dans l’interface d’administration de Django. Le formulaire « Add choice » ressemble à ceci :</p>\n<img alt=\"Page d'administration des objets Choice\" src=\"/fr/6.1/_images/admin09.png\" />\n<p>Dans ce formulaire, le champ « Question » est une boîte de sélection contenant toutes les questions de la base de données. Django sait qu’une <a class=\"reference internal\" href=\"/fr/6.1/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> doit être représentée dans l’interface d’administration par une boîte <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;select&gt;</span></code>. Dans notre cas, seule une question existe à ce stade.</p>\n<p>Remarquez aussi le bouton « Ajouter une autre question » (affiché sous forme de signe plus) à droite du champ « Question ». Chaque relation <code class=\"docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code> hérite ce bouton automatiquement. Quand vous cliquez sur ce bouton, vous obtenez une fenêtre modale avec le formulaire « Ajouter une question ». Si vous ajoutez une question dans cette fenêtre et cliquez sur « Enregistrer », Django enregistrera la question en base et l’ajoutera dynamiquement dans la sélection du formulaire « Ajouter un choix » que vous voyez.</p>\n<p>Mais franchement, c’est une manière inefficace d’ajouter des objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> dans le système. Il serait préférable d’ajouter un groupe de choix « Choices » directement lorsque vous créez l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>. Essayons de cette façon.</p>\n<p>Enlevez l’appel <code class=\"docutils literal notranslate\"><span class=\"pre\">register()</span></code> pour le modèle <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code>. Puis, modifiez le code d’inscription de <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code> comme ceci :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python 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\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Choice</span><span class=\"p\">,</span> <span class=\"n\">Question</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">StackedInline</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Choice</span>\n    <span class=\"n\">extra</span> <span class=\"o\">=</span> <span class=\"mi\">3</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</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;question_text&quot;</span><span class=\"p\">]}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;Date information&quot;</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;pub_date&quot;</span><span class=\"p\">],</span> <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=\"p\">]</span>\n    <span class=\"n\">inlines</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">ChoiceInline</span><span class=\"p\">]</span>\n\n\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\">Question</span><span class=\"p\">,</span> <span class=\"n\">QuestionAdmin</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Cela indique à Django : « les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> sont édités dans la page d’administration de <code class=\"docutils literal notranslate\"><span class=\"pre\">Question</span></code>. Par défaut, fournir assez de place pour 3 choix ».</p>\n<p>Chargez la page « Ajout Question » pour voir à quoi ça ressemble :</p>\n<img alt=\"La page d'ajout de question possède maintenant des choix\" src=\"/fr/6.1/_images/admin10t.png\" />\n<p>Ça marche comme ceci : il y a trois emplacements pour les choix « Choices » liés – comme indiqué par <code class=\"docutils literal notranslate\"><span class=\"pre\">extra</span></code> – et chaque fois que vous revenez sur la page de modification d’un objet déjà créé, vous obtenez trois emplacements supplémentaires.</p>\n<p>Au bas des trois emplacements actuels, vous pouvez trouver un lien « Add another Choice ». Si vous cliquez dessus, un nouvel emplacement apparaît. Si vous souhaitez supprimer l’emplacement ajouté, vous pouvez cliquer sur le X en haut à droite de l’emplacement. Cette image montre l’emplacement ajouté :</p>\n<img alt=\"Formulaire supplémentaire ajouté dynamiquement\" src=\"/fr/6.1/_images/admin14t.png\" />\n<p>Un petit problème cependant. Cela prend beaucoup de place d’afficher tous les champs pour saisir les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Choice</span></code> liés. C’est pour cette raison que Django offre une alternative d’affichage en tableau des objets liés. Pour l’utiliser, modifiez la déclaration <code class=\"docutils literal notranslate\"><span class=\"pre\">ChoiceInline</span></code> comme ceci :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChoiceInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">TabularInline</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></figure>\n<p>Avec ce <code class=\"docutils literal notranslate\"><span class=\"pre\">TabularInline</span></code> (au lieu de <code class=\"docutils literal notranslate\"><span class=\"pre\">StackedInline</span></code>), les objets liés sont affichés dans un format plus compact, tel qu’un tableau :</p>\n<img alt=\"La page d'ajout de question possède maintenant des choix plus compacts\" src=\"/fr/6.1/_images/admin11t.png\" />\n<p>Remarquez la colonne supplémentaire « Delete? » qui permet de supprimer des lignes ajoutées à l’aide du bouton « Add another Choice » ainsi que les lignes déjà enregistrées.</p>\n</section>\n<section id=\"customize-the-admin-change-list\">\n<h2>Personnalisation de la liste pour modification de l’interface d’administration<a class=\"heading-anchor\" href=\"#customize-the-admin-change-list\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Maintenant que la page d’administration des <code class=\"docutils literal notranslate\"><span class=\"pre\">Questions</span></code> présente un peu mieux, améliorons la page « liste pour modification » – celle qui affiche toutes les questions du système.</p>\n<p>Voici à quoi ça ressemble pour l’instant :</p>\n<img alt=\"Page de liste pour modification des sondages\" src=\"/fr/6.1/_images/admin04t.png\" />\n<p>Par défaut, Django affiche le <code class=\"docutils literal notranslate\"><span class=\"pre\">str()</span></code> de chaque objet. Mais parfois, il serait plus utile d’afficher des champs particuliers. Dans ce but, utilisez l’option <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a>, qui est une liste de noms de champs à afficher, en colonnes, sur la page liste pour modification de l’objet :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]</span>\n</code></pre></figure>\n<p>Pour la démonstration, incluons également la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently()</span></code> du <a class=\"reference internal\" href=\"/fr/6.1/intro/tutorial02/\"><span class=\"doc\">tutoriel 2</span></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QuestionAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;was_published_recently&quot;</span><span class=\"p\">]</span>\n</code></pre></figure>\n<p>À présent, la page liste pour modification des questions ressemble à ceci :</p>\n<img alt=\"Page de liste pour modification des sondages, mise à jour\" src=\"/fr/6.1/_images/admin12t.png\" />\n<p>Vous pouvez cliquer sur les en-têtes de colonne pour trier selon ces valeurs – sauf dans le cas de l’en-tête <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently</span></code>, parce que le tri selon le résultat d’une méthode arbitraire n’est pas pris en charge. Notez aussi que l’en-tête de la colonne pour <code class=\"docutils literal notranslate\"><span class=\"pre\">was_published_recently</span></code> est, par défaut, le nom de la méthode (avec les soulignements remplacés par des espaces) et que chaque ligne contient la représentation textuelle du résultat.</p>\n<p>Vous pouvez améliorer cela en appliquant le décorateur  <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">display()</span></code></a> à cette méthode (en étendant le fichier <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code> créé lors du <a class=\"reference internal\" href=\"/fr/6.1/intro/tutorial02/\"><span class=\"doc\">tutoriel 2</span></a>), comme ceci :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/models.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python 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\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Question</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=\"c1\"># ...</span>\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span><span class=\"n\">display</span><span class=\"p\">(</span>\n        <span class=\"n\">boolean</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"n\">ordering</span><span class=\"o\">=</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s2\">&quot;Published recently?&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">was_published_recently</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">now</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"n\">now</span> <span class=\"o\">-</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">timedelta</span><span class=\"p\">(</span><span class=\"n\">days</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"o\">&lt;=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">pub_date</span> <span class=\"o\">&lt;=</span> <span class=\"n\">now</span>\n</code></pre></figure>\n<p>Pour plus d’informations sur les propriétés configurables par ce décorateur, consultez <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a>.</p>\n<p>Modifiez encore une fois le fichier <code class=\"file docutils literal notranslate\"><span class=\"pre\">polls/admin.py</span></code> et améliorez la page de liste pour modification des <code class=\"docutils literal notranslate\"><span class=\"pre\">Questions</span></code>: ajout de filtrage à l’aide de l’attribut <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter\" title=\"django.contrib.admin.ModelAdmin.list_filter\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_filter</span></code></a>. Ajoutez la ligne suivante à <code class=\"docutils literal notranslate\"><span class=\"pre\">QuestionAdmin</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=\"n\">list_filter</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;pub_date&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Cela ajoute une barre latérale « Filter » qui permet de filtrer la liste pour modification selon le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> :</p>\n<img alt=\"Page de liste pour modification des sondages, mise à jour\" src=\"/fr/6.1/_images/admin13t.png\" />\n<p>Le type de filtre affiché dépend du type de champ à filtrer. Comme <code class=\"docutils literal notranslate\"><span class=\"pre\">pub_date</span></code> est un champ <a class=\"reference internal\" href=\"/fr/6.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a>, Django sait fournir des options de filtrage appropriées : « Toutes les dates », « Aujourd’hui », « Les 7 derniers jours », « Ce mois-ci », « Cette année ».</p>\n<p>Ça a meilleure forme. Ajoutons une fonctionnalité de recherche :</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\">search_fields</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;question_text&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Cela ajoute une boîte de recherche en haut de la liste pour modification. Quand quelqu’un saisit des termes de recherche, Django va rechercher dans le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">question_text</span></code>. Vous pouvez indiquer autant de champs que vous le désirez – néanmoins, en raison de l’emploi d’une requête <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> en arrière-plan, il s’agit de rester raisonnable quant au nombre de champs de recherche, sinon la base de données risque de tirer la langue !</p>\n<p>Now’s also a good time to note that change lists give you free pagination. The\ndefault is to display 100 items per page.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>The following <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> options allow\nfurther customization of change lists:\n<a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_per_page\" title=\"django.contrib.admin.ModelAdmin.list_per_page\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_per_page</span></code></a>,\n<a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields\" title=\"django.contrib.admin.ModelAdmin.search_fields\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">search_fields</span></code></a>,\n<a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.date_hierarchy\" title=\"django.contrib.admin.ModelAdmin.date_hierarchy\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">date_hierarchy</span></code></a>, and\n<a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display\" title=\"django.contrib.admin.ModelAdmin.list_display\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">list_display</span></code></a>.</p>\n</aside>\n</section>\n<section id=\"customize-the-admin-look-and-feel\">\n<h2>Personnalisation de l’apparence de l’interface d’administration<a class=\"heading-anchor\" href=\"#customize-the-admin-look-and-feel\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Clairement, avoir « Django administration » en haut de chaque page d’administration est ridicule. C’est juste du texte de substitution.</p>\n<p>Toutefois, vous pouvez le changer en utilisant le système de gabarits de Django. Le site d’administration de Django est écrit lui-même avec Django, et ses interfaces utilisent le système de gabarits propre à Django.</p>\n<section id=\"customizing-your-project-s-templates\">\n<span id=\"ref-customizing-your-projects-templates\"></span><h3>Personnalisation des gabarits de votre <em>projet</em><a class=\"heading-anchor\" href=\"#customizing-your-project-s-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Créez un répertoire s’appelant <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">djangotutorial</span></code>. Les gabarits peuvent se trouver à n’importe quel endroit du système de fichiers, pourvu qu’ils soient accessibles par Django (Django utilise le même utilisateur que celui qui a démarré votre serveur). Cependant, par convention, il est recommandé de conserver les gabarits à l’intérieur du projet.</p>\n<p>Ouvrez votre fichier de configuration (<code class=\"file docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code>, souvenez-vous) et ajoutez une option <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> dans le réglage <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.template.backends.django.DjangoTemplates&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;DIRS&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">BASE_DIR</span> <span class=\"o\">/</span> <span class=\"s2\">&quot;templates&quot;</span><span class=\"p\">],</span>\n        <span class=\"s2\">&quot;APP_DIRS&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;context_processors&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n                <span class=\"s2\">&quot;django.template.context_processors.request&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;django.contrib.auth.context_processors.auth&quot;</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;django.contrib.messages.context_processors.messages&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</code></pre></figure>\n<p><a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> est une liste de répertoires du système de fichiers que Django parcourt lorsqu’il doit charger les gabarits ; il s’agit d’un chemin de recherche.</p>\n<aside class=\"admonition-organizing-templates admonition\">\n<p class=\"admonition-title\">Organisation des gabarits</p>\n<p>Tout comme pour les fichiers statiques, nous <em>pourrions</em> placer tous nos gabarits à un seul endroit et tout fonctionnerait très bien. Cependant, les gabarits qui appartiennent à une application particulière devraient se trouver dans le répertoire des gabarits de l’application (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code>)  plutôt que dans celui du projet (<code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code>). Nous aborderons plus en détails les raisons de ces choix dans le <a class=\"reference internal\" href=\"/fr/6.1/intro/reusable-apps/\"><span class=\"doc\">tutoriel sur les applications réutilisables</span></a>.</p>\n</aside>\n<p>Créez maintenant dans <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> un répertoire nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> et copiez-y le gabarit  <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code> à partir du répertoire par défaut des gabarits d’administration dans le code source de Django (<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/contrib/admin/templates\">django/contrib/admin/templates</a>).</p>\n<aside class=\"admonition-where-are-the-django-source-files admonition\">\n<p class=\"admonition-title\">Où se trouvent les fichiers sources de Django ?</p>\n<p>Si vous ne savez pas où les fichiers source de Django se trouvent sur votre système, lancez la commande suivante :</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>-c<span class=\"w\"> </span><span class=\"s2\">&quot;import django; print(django.__path__)&quot;</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py -c <span class=\"s2\">&quot;import django; print(django.__path__)&quot;</span>\n</code></pre></div></div></div>\n</aside>\n<p>Ensuite, éditez le fichier et remplacez <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site_header|default:_('Django</span> <span class=\"pre\">administration')</span> <span class=\"pre\">}}</span></code> (y compris les accolades) par le nom de votre propre site. Cela devrait donner quelque chose comme :</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\">block</span> <span class=\"nv\">branding</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;site-name&quot;</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=\"k\">url</span> <span class=\"s1\">&#39;admin:index&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>Polls Administration<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">user.is_anonymous</span> <span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span> <span class=\"k\">include</span> <span class=\"s2\">&quot;admin/color_theme_toggle.html&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Nous utilisons cette approche pour vous apprendre comment surcharger des gabarits. Dans un projet réel, vous auriez probablement utilisé l’attribut <a class=\"reference internal\" href=\"/fr/6.1/ref/contrib/admin/#django.contrib.admin.AdminSite.site_header\" title=\"django.contrib.admin.AdminSite.site_header\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.AdminSite.site_header</span></code></a> pour faire cette même modification de manière plus simple.</p>\n<p>Ce fichier gabarit contient beaucoup de texte comme <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">branding</span> <span class=\"pre\">%}</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">title</span> <span class=\"pre\">}}</span></code>. Les balises <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span></code> font partie du langage de gabarit de Django. Lorsque Django génère <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code>, le langage de gabarit est évalué afin de produire la page HTML finale, tout comme nous l’avons vu dans le <a class=\"reference internal\" href=\"/fr/6.1/intro/tutorial03/\"><span class=\"doc\">3ème tutoriel</span></a>.</p>\n<p>Notez que tous les gabarits de l’interface d’administration par défaut de Django peuvent être remplacés. Pour remplacer un gabarit, faites la même chose qu’avec <code class=\"docutils literal notranslate\"><span class=\"pre\">base_site.html</span></code>, copiez-le depuis le répertoire par défaut dans votre répertoire personnalisé, et faites les modifications nécessaires.</p>\n</section>\n<section id=\"customizing-your-application-s-templates\">\n<h3>Personnalisation des gabarits de votre <em>application</em><a class=\"heading-anchor\" href=\"#customizing-your-application-s-templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les lecteurs avisés demanderont : mais si <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> était vide par défaut, comment Django trouvait-il les gabarits par défaut de l’interface d’administration ? La réponse est que dans la mesure où <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a> est défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, Django regarde automatiquement dans un éventuel sous-répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">templates/</span></code> à l’intérieur de chaque paquet d’application, pour l’utiliser en dernier recours (n’oubliez pas que <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code> est aussi une application).</p>\n<p>Notre application de sondage n’est pas très compliquée et ne nécessite pas de gabarits d’administration personnalisés. Mais si elle devenait plus sophistiquée et qu’il faille modifier les gabarits standards de l’administration de Django pour certaines fonctionnalités, il serait plus logique de modifier les gabarits de l”<em>application</em>, et non pas ceux du <em>projet</em>. De cette façon, vous pourriez inclure l’application « polls » dans tout nouveau projet en étant certain que Django trouve les gabarits personnalisés nécessaires.</p>\n<p>Lisez la <a class=\"reference internal\" href=\"/fr/6.1/topics/templates/#template-loading\"><span class=\"std std-ref\">documentation sur le chargement de gabarits</span></a> pour des informations complètes sur la manière dont Django trouve ses gabarits.</p>\n</section>\n</section>\n<section id=\"customize-the-admin-index-page\">\n<h2>Personnalisation de la page d’accueil de l’interface d’administration<a class=\"heading-anchor\" href=\"#customize-the-admin-index-page\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>De la même manière, il peut être souhaitable de personnaliser l’apparence de la page d’index de l’interface d’administration de Django.</p>\n<p>Par défaut, il affiche toutes les applications de <a class=\"reference internal\" href=\"/fr/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> qui ont été inscrites dans l’application admin, par ordre alphabétique. Il est possible de faire des modifications significatives sur la mise en page. Après tout, la page d’index est probablement la page la plus importante du site d’administration, donc autant qu’elle soit facile à utiliser.</p>\n<p>Le gabarit à personnaliser est <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/index.html</span></code> (faites la même chose qu’avec <code class=\"docutils literal notranslate\"><span class=\"pre\">admin/base_site.html</span></code> dans la précédente section – copiez-le depuis le répertoire par défaut vers votre répertoire de gabarits personnel). Éditez le fichier, et vous verrez qu’il utilise une variable de gabarit appelée <code class=\"docutils literal notranslate\"><span class=\"pre\">app_list</span></code>. Cette variable contient toutes les applications Django installées et inscrites. À la place, vous pouvez écrire en dur les liens vers les pages d’administration spécifiques aux objets de la manière qui vous convient.</p>\n<p>Lorsque vous vous serez familiarisé avec le site d’administration, lisez la <a class=\"reference internal\" href=\"/fr/6.1/intro/tutorial08/\"><span class=\"doc\">partie 8 de ce tutoriel</span></a> pour apprendre comment intégrer des paquets tiers.</p>\n</section>","rootId":"writing-your-first-django-app-part-7","toc":[{"title":"Personnalisation du formulaire d’administration","anchor":"customize-the-admin-form","children":[]},{"title":"Ajout d’objets liés","anchor":"adding-related-objects","children":[]},{"title":"Personnalisation de la liste pour modification de l’interface d’administration","anchor":"customize-the-admin-change-list","children":[]},{"title":"Personnalisation de l’apparence de l’interface d’administration","anchor":"customize-the-admin-look-and-feel","children":[{"title":"Personnalisation des gabarits de votre projet","anchor":"customizing-your-project-s-templates","children":[]},{"title":"Personnalisation des gabarits de votre application","anchor":"customizing-your-application-s-templates","children":[]}]},{"title":"Personnalisation de la page d’accueil de l’interface d’administration","anchor":"customize-the-admin-index-page","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Premiers pas","url":"/fr/6.1/intro/"}],"prev":{"docname":"intro/tutorial06","title":"Écriture de votre première application Django, 6ème partie","url":"/fr/6.1/intro/tutorial06/"},"next":{"docname":"intro/tutorial08","title":"Écriture de votre première application Django, 8ème partie","url":"/fr/6.1/intro/tutorial08/"},"formats":{"html":"/fr/6.1/intro/tutorial07/","markdown":"/fr/6.1/intro/tutorial07.md","json":"/fr/6.1/intro/tutorial07.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/intro/tutorial07.txt","official":"https://docs.djangoproject.com/fr/6.1/intro/tutorial07/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}