{"title":"Écriture de votre première application Django, 6ème partie","version":"3.2","locale":"fr","docname":"intro/tutorial06","url":"/fr/3.2/intro/tutorial06/","canonical":"https://djangodocs.dev/fr/3.2/intro/tutorial06/","summary":"Ce tutoriel commence là où le tutoriel 5 s’est achevé. Nous avons construit une application Web de sondage et nous allons maintenant ajouter une feuille de style et…","html":"<h1>Écriture de votre première application Django, 6ème partie<a class=\"heading-anchor\" href=\"#writing-your-first-django-app-part-6\"><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/3.2/intro/tutorial05/\"><span class=\"doc\">tutoriel 5</span></a> s’est achevé. Nous avons construit une application Web de sondage et nous allons maintenant ajouter une feuille de style et une image.</p>\n<p>En plus du code HTML généré par le serveur, les applications Web doivent généralement servir des fichiers supplémentaires tels que des images, du JavaScript ou du CSS, utiles pour produire une page Web complète. Dans Django, on appelle ces fichiers des « fichiers statiques ».</p>\n<p>Pour de petits projets, ce n’est pas un grand problème car il est possible de placer les fichiers statiques à un endroit où le serveur Web peut les trouver. Cependant, dans des plus gros projets, surtout pour ceux qui contiennent plusieurs applications, la gestion de plusieurs groupes de fichiers statiques fournis par chaque application commence à devenir plus complexe.</p>\n<p>C’est le travail de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.staticfiles</span></code> : il collecte les fichiers statiques de chaque application (et de tout autre endroit que vous lui indiquez) pour les mettre dans un seul emplacement qui peut être facilement configuré pour servir les fichiers en production.</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/3.2/faq/help/\"><span class=\"doc\">Obtenir de l’aide</span></a> de la FAQ.</p>\n</aside>\n<section id=\"customize-your-app-s-look-and-feel\">\n<h2>Personnalisation de l’apparence de votre application<a class=\"heading-anchor\" href=\"#customize-your-app-s-look-and-feel\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Commencez par créer un répertoire nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">static</span></code> dans votre répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>. C’est là que Django va chercher les fichiers statiques, sur le même principe que la recherche de gabarits dans <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/</span></code>.</p>\n<p>Le réglage <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-STATICFILES_FINDERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATICFILES_FINDERS</span></code></a> de Django contient une liste de classes qui savent où aller chercher les fichiers statiques de différentes sources. Une de ces classes par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">AppDirectoriesFinder</span></code> qui recherche un sous-répertoire « static » dans chaque application de <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, comme l’application <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> de notre tutoriel. Le site d’administration utilise la même structure de répertoires pour ses propres fichiers statiques.</p>\n<p>À l’intérieur du répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">static</span></code> que vous venez de créer, créez un autre répertoire nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> dans lequel vous placez un fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">style.css</span></code>. Autrement dit, votre feuille de style devrait se trouver à <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code>. En raison du fonctionnement de <code class=\"docutils literal notranslate\"><span class=\"pre\">AppDirectoriesFinder</span></code>, vous pouvez vous référez à ce fichier depuis Django avec la syntaxe <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/style.css</span></code>, sur le même principe utilisé pour se référer aux chemins de gabarits.</p>\n<aside class=\"admonition-static-file-namespacing admonition\">\n<p class=\"admonition-title\">Espaces de noms des fichiers statiques</p>\n<p>Tout comme pour les gabarits, nous <em>pourrions</em> plus simplement placer nos fichiers statiques directement dans <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static</span></code> (au lieu de créer un sous-répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>), mais ce serait une mauvaise idée. Django choisit le premier fichier statique trouvé  correspondant au nom recherché, et si vous aviez un fichier de même nom dans une <em>autre</em> application, Django ne pourrait pas les distinguer. Nous devons pouvoir indiquer à Django le bon fichier et le meilleur moyen de s’en assurer est d’utiliser les <em>espaces de noms</em>. C’est-à-dire en plaçant ces fichiers statiques dans un <em>autre</em> sous-répertoire nommé d’après l’application.</p>\n</aside>\n<p>Écrivez le code suivant dans cette feuille de style (<code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code>) :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"css\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Css</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=\"Css code\"><code><span class=\"nt\">li</span><span class=\"w\"> </span><span class=\"nt\">a</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">color</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"kc\">green</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>Ensuite, ajoutez le contenu ci-dessous au début de <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/polls/index.html</span></code> :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"html+django\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates/polls/index.html</span></code></figcaption>\n<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\">static</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">link</span> <span class=\"na\">rel</span><span class=\"o\">=</span><span class=\"s\">&quot;stylesheet&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;text/css&quot;</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">static</span> <span class=\"s1\">&#39;polls/style.css&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></figure>\n<p>La balise de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">static</span> <span class=\"pre\">%}</span></code> génère l’URL absolue des fichiers statiques.</p>\n<p>C’est tout ce que vous avez à faire pour le développement.</p>\n<p>Démarrez le serveur (ou redémarrez-le s’il tourne déjà) :</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>manage.py<span class=\"w\"> </span>runserver\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 manage.py runserver\n</code></pre></div></div></div>\n<p>Rechargez <code class=\"docutils literal notranslate\"><span class=\"pre\">http://localhost:8000/polls/</span></code> et vous devriez voir que les liens des questions sont verts (style Django !) ce qui signifie que votre feuille de style a été correctement chargée.</p>\n</section>\n<section id=\"adding-a-background-image\">\n<h2>Ajout d’une image d’arrière-plan<a class=\"heading-anchor\" href=\"#adding-a-background-image\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ensuite, nous allons créer un sous-répertoire pour les images. Créez un sous-répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">images</span></code> dans le répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/</span></code>. Dans le répertoire créé, placez une image nommée <code class=\"docutils literal notranslate\"><span class=\"pre\">background.gif</span></code>. Autrement dit, le chemin de votre image sera <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/images/background.gif</span></code>.</p>\n<p>Puis, ajoutez ceci à votre feuille de style (<code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code>) :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"css\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">polls/static/polls/style.css</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Css</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=\"Css code\"><code><span class=\"nt\">body</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"k\">background</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"kc\">white</span><span class=\"w\"> </span><span class=\"nb\">url</span><span class=\"p\">(</span><span class=\"s2\">&quot;images/background.gif&quot;</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"kc\">no-repeat</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<p>Rechargez <code class=\"docutils literal notranslate\"><span class=\"pre\">http://localhost:8000/polls/</span></code> et vous devriez voir l’arrière-plan chargé dans le coin supérieur gauche de l’écran.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>La balise de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">static</span> <span class=\"pre\">%}</span></code> n’est pas disponible dans les fichiers statiques qui ne sont pas générés par Django, comme une feuille de style. Vous devriez toujours utiliser des <strong>chemins relatifs</strong> pour lier vos fichiers statiques entre eux, car vous pouvez ensuite modifier <a class=\"reference internal\" href=\"/fr/3.2/ref/settings/#std-setting-STATIC_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATIC_URL</span></code></a> (utilisé par la balise de gabarit <a class=\"reference internal\" href=\"/fr/3.2/ref/templates/builtins/#std-templatetag-static\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">static</span></code></a> pour générer les URL) sans devoir modifier tous les chemins dans les fichiers statiques.</p>\n</aside>\n<p>Ce sont les <strong>bases</strong>. Pour plus de détails sur les réglages et les autres fonctionnalités inclues dans le module, lisez le <a class=\"reference internal\" href=\"/fr/3.2/howto/static-files/\"><span class=\"doc\">manuel des fichiers statiques</span></a> et la  <a class=\"reference internal\" href=\"/fr/3.2/ref/contrib/staticfiles/\"><span class=\"doc\">référence des fichiers statiques</span></a>.  La section <a class=\"reference internal\" href=\"/fr/3.2/howto/static-files/deployment/\"><span class=\"doc\">déploiement des fichiers statiques</span></a> aborde l’utilisation des fichiers statiques sur un vrai serveur.</p>\n<p>Lorsque vous serez à l’aise avec les fichiers statiques, lisez la <a class=\"reference internal\" href=\"/fr/3.2/intro/tutorial07/\"><span class=\"doc\">partie 7 de ce tutoriel</span></a> pour apprendre comment personnaliser l’interface d’administration automatique de Django.</p>\n</section>","rootId":"writing-your-first-django-app-part-6","toc":[{"title":"Personnalisation de l’apparence de votre application","anchor":"customize-your-app-s-look-and-feel","children":[]},{"title":"Ajout d’une image d’arrière-plan","anchor":"adding-a-background-image","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Premiers pas","url":"/fr/3.2/intro/"}],"prev":{"docname":"intro/tutorial05","title":"Écriture de votre première application Django, 5ème partie","url":"/fr/3.2/intro/tutorial05/"},"next":{"docname":"intro/tutorial07","title":"Écriture de votre première application Django, 7ème partie","url":"/fr/3.2/intro/tutorial07/"},"formats":{"html":"/fr/3.2/intro/tutorial06/","markdown":"/fr/3.2/intro/tutorial06.md","json":"/fr/3.2/intro/tutorial06.json"},"source":"https://github.com/django/django/blob/stable/3.2.x/docs/intro/tutorial06.txt","official":"https://docs.djangoproject.com/fr/3.2/intro/tutorial06/","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"]}