{"title":"Le langage de gabarit de Django","version":"5.2","locale":"fr","docname":"ref/templates/language","url":"/fr/5.2/ref/templates/language/","canonical":"https://djangodocs.dev/fr/5.2/ref/templates/language/","summary":"Ce document présente la syntaxe du langage du système de gabarits de Django. Si vous recherchez une perspective plus technique sur son fonctionnement et sur la…","html":"<h1>Le langage de gabarit de Django<a class=\"heading-anchor\" href=\"#the-django-template-language\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ce document présente la syntaxe du langage du système de gabarits de Django. Si vous recherchez une perspective plus technique sur son fonctionnement et sur la manière de l’étendre, consultez <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/api/\"><span class=\"doc\">Le langage de gabarit de Django : pour les programmeurs Python</span></a>.</p>\n<p>Le langage de gabarit de Django est conçu comme un compromis entre puissance et simplicité. Il est conçu pour que les habitués au code HTML se sentent à l’aise. Si vous avez des connaissances d’autres langages de gabarit orientés texte, tels que <a class=\"reference external\" href=\"https://www.smarty.net/\">Smarty</a> ou <a class=\"reference external\" href=\"https://palletsprojects.com/p/jinja/\">Jinja2</a>, vous n’allez pas être dépaysés avec les gabarits de Django.</p>\n<aside class=\"admonition-philosophy admonition\">\n<p class=\"admonition-title\">Philosophie</p>\n<p>Si vous avez un arrière-plan de programmation ou que vous êtes habitué aux langages qui mélangent le code de programmation directement dans le code HTML, vous devrez garder à l’esprit que le système des gabarits de Django n’est pas simplement du code Python intégré dans du code HTML. C’est un concept volontaire : le système des gabarits est conçu pour exprimer de la présentation, et non pas de la logique de programmation.</p>\n<p>Le système des gabarits de Django fournit des balises dont les fonctions sont semblables à certaines structures de programmation (une balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">if</span></code></a> pour les tests booléens, une balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">for</span></code></a> pour les boucles, etc.), mais celles-ci ne sont pas simplement exécutées comme le code Python correspondant ; le système des gabarits de Django n’exécute pas n’importe quelle expression Python. Seuls les balises, les filtres et la syntaxe présentés ci-dessous sont pris en charge par défaut (même si vous pouvez ajouter <a class=\"reference internal\" href=\"/fr/5.2/howto/custom-template-tags/\"><span class=\"doc\">vos propres extensions</span></a> au langage de gabarit selon vos besoins).</p>\n</aside>\n<section id=\"templates\">\n<h2>Gabarits<a class=\"heading-anchor\" href=\"#templates\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Un gabarit est un fichier texte. Il peut générer tout format basé sur du texte (HTML, XML, CSV, etc.).</p>\n<p>Un gabarit contient des <strong>variables</strong> qui sont remplacées par des valeurs lorsque le gabarit est évalué, ainsi que des <strong>balises</strong> qui contrôlent la logique du gabarit.</p>\n<p>Voici un gabarit minimal illustrant quelques principes de base. Chaque élément sera ensuite expliqué plus loin dans ce document.</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\">extends</span> <span class=\"s2\">&quot;base_generic.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}{{</span> <span class=\"nv\">section.title</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">section.title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">story</span> <span class=\"k\">in</span> <span class=\"nv\">story_list</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&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\">story.get_absolute_url</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">story.headline</span><span class=\"o\">|</span><span class=\"nf\">upper</span> <span class=\"cp\">}}</span>\n  <span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">story.tease</span><span class=\"o\">|</span><span class=\"nf\">truncatewords</span><span class=\"s2\">:&quot;100&quot;</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition-philosophy admonition\">\n<p class=\"admonition-title\">Philosophie</p>\n<p>Pourquoi utiliser des gabarits basés sur du texte plutôt qu’en XML (comme le langage TAL de Zope) ? Nous avons souhaité que le langage de gabarit de Django ne soit pas uniquement utilisable pour des gabarits XML/HTML. Vous pouvez utiliser le langage de gabarit pour tout format basé sur du texte, tel que des courriels, du JavaScript ou du CSV.</p>\n</aside>\n</section>\n<section id=\"variables\">\n<span id=\"template-variables\"></span><h2>Variables<a class=\"heading-anchor\" href=\"#variables\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les variables apparaissent comme ceci : <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">variable</span> <span class=\"pre\">}}</span></code>. Lorsque le moteur de gabarit rencontre une variable, il l’évalue et la remplace par le résultat. Les noms de variables peuvent contenir tout caractère alphanumérique ainsi que le soulignement (<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;_&quot;</span></code>) mais ne peuvent pas commencer par un soulignement et ne peuvent pas être un nombre. Le point (<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;.&quot;</span></code>) peut aussi faire partie du nom de variable, mais avec une signification particulière, comme nous l’expliquons ci-après. Il est important de relever que <em>les espaces et la ponctuation ne sont pas autorisés dans les noms de variables</em>.</p>\n<p>Le point (<code class=\"docutils literal notranslate\"><span class=\"pre\">.</span></code>) est utilisé pour accéder aux attributs d’une variable.</p>\n<aside class=\"admonition-behind-the-scenes admonition\">\n<p class=\"admonition-title\">En coulisses</p>\n<p>Techniquement, lorsque le système de gabarits rencontre un point, il essaie les méthodes d’accès suivantes, dans l’ordre :</p>\n<ul class=\"simple\">\n<li><p>Consultation de dictionnaire</p></li>\n<li><p>Consultation d’attribut ou de méthode</p></li>\n<li><p>Consultation d’indice numérique</p></li>\n</ul>\n<p>Si la valeur résultante est exécutable, elle est appelée sans paramètre. Le résultat de l’appel devient la valeur de gabarit.</p>\n<p>Cet ordre de consultation peut aboutir à un comportement inattendu avec des objets qui surchargent la consultation de dictionnaire. Par exemple, considérez l’extrait de code suivant qui essaie de faire une boucle sur un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">collections.defaultdict</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\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">k</span><span class=\"o\">,</span> <span class=\"nv\">v</span> <span class=\"k\">in</span> <span class=\"nv\">defaultdict.items</span> <span class=\"cp\">%}</span>\n    Do something with k and v here...\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Comme la consultation de dictionnaire s’effectue en premier, c’est ce qui arrive ici et une valeur par défaut en résulte au lieu de la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">.items()</span></code> attendue. Dans ce cas, il faut envisager de convertir l’objet en dictionnaire simple au préalable.</p>\n</aside>\n<p>Dans l’exemple ci-dessus, <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">section.title</span> <span class=\"pre\">}}</span></code> sera remplacé par l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> de l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">section</span></code>.</p>\n<p>Si vous appelez une variable qui n’existe pas, le système des gabarits insère la valeur de l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">string_if_invalid</span></code>, qui vaut  <code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code> (chaîne vide) par défaut.</p>\n<p>Notez que « bar » dans une expression de gabarit comme <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">foo.bar</span> <span class=\"pre\">}}</span></code> est interprété comme une chaîne littérale et même si une variable « bar » existe dans le contexte du gabarit, elle ne sera pas appelée.</p>\n<p>Les attributs de variable qui commencent par un soulignement ne peuvent pas être accédés car ils sont généralement considérés comme privés.</p>\n</section>\n<section id=\"filters\">\n<h2>Filtres<a class=\"heading-anchor\" href=\"#filters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Vous pouvez modifier l’affichage des variables en utilisant des <strong>filtres</strong>.</p>\n<p>Les filtres ressemblent à ceci : <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">nom|lower</span> <span class=\"pre\">}}</span></code>. Ceci affiche la valeur de la variable <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">nom</span> <span class=\"pre\">}}</span></code> après avoir été filtrée par le filtre <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-lower\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">lower</span></code></a> qui convertit le texte en minuscules. Utilisez la barre verticale (<code class=\"docutils literal notranslate\"><span class=\"pre\">|</span></code>) pour appliquer un filtre.</p>\n<p>Les filtres peuvent s’enchaîner. Le résultat d’un filtre est appliqué au suivant. <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">text|escape|linebreaks</span> <span class=\"pre\">}}</span></code> est un idiome courant pour échapper du contenu textuel, puis convertir les sauts de ligne en balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;p&gt;</span></code>.</p>\n<p>Certains filtres acceptent des paramètres. Un paramètre de filtre ressemble à ceci : <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">bio|truncatewords:30</span> <span class=\"pre\">}}</span></code>. Ceci affiche les 30 premiers mots de la variable <code class=\"docutils literal notranslate\"><span class=\"pre\">bio</span></code>.</p>\n<p>Les paramètres de filtre contenant des espaces doivent être placés entre guillemets ; par exemple, pour concaténer une liste en utilisant une virgule et une espace, il faudrait écrire <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">liste|join:&quot;,</span> <span class=\"pre\">&quot;</span> <span class=\"pre\">}}</span></code>.</p>\n<p>Django fournit une soixantaine de filtres de gabarit intégrés. Il sont tous documentés dans la <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#ref-templates-builtins-filters\"><span class=\"std std-ref\">référence des filtres intégrés</span></a>. Pour vous donner une idée de ce qui est disponible, voici quelques-uns des filtres de gabarit les plus utilisés :</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-default\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">default</span></code></a></dt><dd><p>Si une variable contient la valeur faux ou est vide, ce filtre utilise la valeur par défaut indiquée. Sinon, il utilise la valeur de la variable. 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=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">default</span><span class=\"s2\">:&quot;nothing&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> n’est pas fournie ou qu’elle est vide, le code ci-dessus affiche « <code class=\"docutils literal notranslate\"><span class=\"pre\">nothing</span></code> ».</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-length\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">length</span></code></a></dt><dd><p>Renvoie la longueur de la valeur. Cela fonctionne aussi bien pour du texte que des listes. 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=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">['a',</span> <span class=\"pre\">'b',</span> <span class=\"pre\">'c',</span> <span class=\"pre\">'d']</span></code>, le résultat sera <code class=\"docutils literal notranslate\"><span class=\"pre\">4</span></code>.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-filesizeformat\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">filesizeformat</span></code></a></dt><dd><p>Met en forme la valeur sous forme de taille de fichier humainement lisible (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">'13</span> <span class=\"pre\">Kio'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'4.1</span> <span class=\"pre\">Mio'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'102</span> <span class=\"pre\">octets'</span></code>, etc). 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=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">filesizeformat</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>SI <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> contient 123456789, le résultat sera <code class=\"docutils literal notranslate\"><span class=\"pre\">117.7</span> <span class=\"pre\">Mio</span></code>.</p>\n</dd>\n</dl>\n<p>Ce n’était que quelques exemples ; voir la <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#ref-templates-builtins-filters\"><span class=\"std std-ref\">référence des filtres intégrés</span></a> pour une liste complète.</p>\n<p>Vous pouvez aussi créer vos propres filtres de gabarit ; voir <a class=\"reference internal\" href=\"/fr/5.2/howto/custom-template-tags/\"><span class=\"doc\">Création de balises et filtres de gabarit personnalisés</span></a>.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>L’interface d’administration de Django peut inclure une référence complète de tous les filtres et balises de gabarit disponibles pour un site donné. Voir <a class=\"reference internal\" href=\"/fr/5.2/ref/contrib/admin/admindocs/\"><span class=\"doc\">Le générateur de documentation de l’administration de Django</span></a>.</p>\n</aside>\n</section>\n<section id=\"tags\">\n<h2>Balises<a class=\"heading-anchor\" href=\"#tags\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les balises (tags en anglais) ressemblent à ceci : <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">tag</span> <span class=\"pre\">%}</span></code>. Les balises sont plus complexes que les variables : certaines produisent du texte, d’autres contrôlent le flux en effectuant des boucles ou de la logique, et d’autres encore chargent des informations externes dans les gabarits pour que des variables puissent les utiliser ensuite.</p>\n<p>Certains balises nécessitent une balise ouvrante et une balise fermante (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">tag</span> <span class=\"pre\">%}</span> <span class=\"pre\">...</span> <span class=\"pre\">contenu</span> <span class=\"pre\">de</span> <span class=\"pre\">la</span> <span class=\"pre\">balise</span> <span class=\"pre\">...</span> <span class=\"pre\">{%</span> <span class=\"pre\">endtag</span> <span class=\"pre\">%}</span></code>).</p>\n<p>Django fournit une vingtaine de balises de gabarit intégrées. Elles sont toutes documentées dans la <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#ref-templates-builtins-tags\"><span class=\"std std-ref\">référence des balises intégrées</span></a>. Pour vous donner une idée de ce qui est disponible, voici quelques-unes des balises de gabarit les plus utilisées :</p>\n<dl>\n<dt><a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">for</span></code></a></dt><dd><p>Boucle sur chaque élément d’une liste. Par exemple, pour afficher la liste des athlètes contenus dans <code class=\"docutils literal notranslate\"><span class=\"pre\">athlete_list</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=\"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\">athlete</span> <span class=\"k\">in</span> <span class=\"nv\">athlete_list</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">athlete.name</span> <span class=\"cp\">}}</span><span class=\"p\">&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</dd>\n<dt><a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">if</span></code></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">elif</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">else</span></code></dt><dd><p>Évalue une variable, et si cette variable vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, le contenu du bloc est affiché :</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\">if</span> <span class=\"nv\">athlete_list</span> <span class=\"cp\">%}</span>\n    Number of athletes: <span class=\"cp\">{{</span> <span class=\"nv\">athlete_list</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">elif</span> <span class=\"nv\">athlete_in_locker_room_list</span> <span class=\"cp\">%}</span>\n    Athletes should be out of the locker room soon!\n<span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n    No athletes.\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Dans l’exemple ci-dessus, si <code class=\"docutils literal notranslate\"><span class=\"pre\">athlete_list</span></code> n’est pas vide, le nombre d’athlètes est affiché par la variable <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">athlete_list|length</span> <span class=\"pre\">}}</span></code>. Sinon, dans le cas où <code class=\"docutils literal notranslate\"><span class=\"pre\">athlete_in_locker_room_list</span></code> n’est pas vide, le message « Athletes should be out… » sera affiché. Si les deux listes sont vides, c’est « No athletes. » qui sera affiché.</p>\n<p>Vous pouvez également utiliser des filtres et différents opérateurs dans la balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">if</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\">if</span> <span class=\"nv\">athlete_list</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"o\">&gt;</span> <span class=\"m\">1</span> <span class=\"cp\">%}</span>\n   Team: <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">athlete</span> <span class=\"k\">in</span> <span class=\"nv\">athlete_list</span> <span class=\"cp\">%}</span> ... <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n   Athlete: <span class=\"cp\">{{</span> <span class=\"nv\">athlete_list.0.name</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Même si l’exemple ci-dessus fonctionne, il faut savoir que la plupart des filtres de gabarit renvoient du texte, et que donc les comparaisons mathématiques impliquant des filtres fonctionnent rarement comme prévu. <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-length\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">length</span></code></a> est une exception.</p>\n</dd>\n<dt><a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> et <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-extends\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">extends</span></code></a></dt><dd><p>Définit l”<a class=\"reference internal\" href=\"#id1\">héritage de gabarits</a> (voir ci-dessous), une manière puissante d’éliminer les contenus redondants au niveau des gabarits.</p>\n</dd>\n</dl>\n<p>Les exemples ci-dessus ne sont qu’une sélection de la liste complète ; voir la <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#ref-templates-builtins-tags\"><span class=\"std std-ref\">référence des balises intégrées</span></a> pour une liste complète.</p>\n<p>Vous pouvez aussi créer vos propres balises de gabarit ; voir <a class=\"reference internal\" href=\"/fr/5.2/howto/custom-template-tags/\"><span class=\"doc\">Création de balises et filtres de gabarit personnalisés</span></a>.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>L’interface d’administration de Django peut inclure une référence complète de tous les filtres et balises de gabarit disponibles pour un site donné. Voir <a class=\"reference internal\" href=\"/fr/5.2/ref/contrib/admin/admindocs/\"><span class=\"doc\">Le générateur de documentation de l’administration de Django</span></a>.</p>\n</aside>\n</section>\n<section id=\"comments\">\n<span id=\"template-comments\"></span><h2>Commentaires<a class=\"heading-anchor\" href=\"#comments\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour commenter une partie de ligne dans un gabarit, utilisez la syntaxe de commentaire : <code class=\"docutils literal notranslate\"><span class=\"pre\">{#</span> <span class=\"pre\">#}</span></code>.</p>\n<p>Par exemple, ce gabarit produit le contenu <code class=\"docutils literal notranslate\"><span class=\"pre\">'hello'</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=\"c\">{# greeting #}</span>hello\n</code></pre></div>\n<p>Un commentaire peut contenir n’importe quel code de gabarit, valide ou non. 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=\"c\">{# {% if foo %}bar{% else %} #}</span>\n</code></pre></div>\n<p>Cette syntaxe n’est utilisable que pour les commentaires d’une seule ligne (aucun saut de ligne n’est autorisé entre les délimiteurs <code class=\"docutils literal notranslate\"><span class=\"pre\">{#</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">#}</span></code>). Si vous avez besoin de mettre en commentaire plusieurs lignes d’un gabarit, référez-vous à la balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">comment</span></code></a>.</p>\n</section>\n<section id=\"template-inheritance\">\n<span id=\"id1\"></span><h2>Héritage de gabarits<a class=\"heading-anchor\" href=\"#template-inheritance\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La partie la plus puissante, mais aussi la plus complexe, du moteur de gabarits de Django est l’héritage des gabarits. Cet héritage permet de construire un gabarit « squelette » de base contenant tous les éléments communs de votre site et de définir des <strong>blocs</strong> que les gabarits enfants peuvent surcharger.</p>\n<p>Examinons l’héritage des gabarits en commençant par un 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\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">html</span> <span class=\"na\">lang</span><span class=\"o\">=</span><span class=\"s\">&quot;en&quot;</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\">link</span> <span class=\"na\">rel</span><span class=\"o\">=</span><span class=\"s\">&quot;stylesheet&quot;</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;style.css&quot;</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=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>My amazing site<span class=\"cp\">{%</span> <span class=\"k\">endblock</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\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\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;sidebar&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">sidebar</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</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;/&quot;</span><span class=\"p\">&gt;</span>Home<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=\"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;/blog/&quot;</span><span class=\"p\">&gt;</span>Blog<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=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n\n    <span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;content&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</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=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Ce gabarit que nous appellerons <code class=\"docutils literal notranslate\"><span class=\"pre\">base.html</span></code> définit un squelette de document HTML qui pourrait être employé pour une page sur deux colonnes. C’est le travail des gabarits « enfants » de remplir les blocs vides avec du contenu.</p>\n<p>Dans cet exemple, la balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> définit trois blocs que les gabarits enfants peuvent remplir. La balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> ne fait que signaler au moteur de gabarits qu’un gabarit enfant peut surcharger ces portions du gabarit.</p>\n<p>Un gabarit enfant pourrait ressembler à ceci :</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\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>My amazing blog<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">entry</span> <span class=\"k\">in</span> <span class=\"nv\">blog_entries</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">entry.title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">entry.body</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</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>La balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-extends\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">extends</span></code></a> est ici la clé. Elle indique au moteur de gabarits que ce gabarit « étend » un autre gabarit. Lorsque le moteur de gabarits l’évalue, il récupère d’abord le parent, dans ce cas « base.html ».</p>\n<p>À ce stade, le moteur de gabarits remarque les trois balises <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> de <code class=\"docutils literal notranslate\"><span class=\"pre\">base.html</span></code> et remplace ces blocs par le contenu du gabarit enfant. En fonction de la valeur de <code class=\"docutils literal notranslate\"><span class=\"pre\">blog_entries</span></code>, le résultat pourrait ressembler à :</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=\"na\">lang</span><span class=\"o\">=</span><span class=\"s\">&quot;en&quot;</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\">link</span> <span class=\"na\">rel</span><span class=\"o\">=</span><span class=\"s\">&quot;stylesheet&quot;</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;style.css&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>My amazing blog<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\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\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;sidebar&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</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;/&quot;</span><span class=\"p\">&gt;</span>Home<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=\"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;/blog/&quot;</span><span class=\"p\">&gt;</span>Blog<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=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n\n    <span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;content&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>Entry one<span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>This is my first entry.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n\n        <span class=\"p\">&lt;</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>Entry two<span class=\"p\">&lt;/</span><span class=\"nt\">h2</span><span class=\"p\">&gt;</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>This is my second entry.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">div</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=\"p\">&lt;/</span><span class=\"nt\">html</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Notez que comme le gabarit enfant n’a pas défini le bloc <code class=\"docutils literal notranslate\"><span class=\"pre\">sidebar</span></code>, c’est la valeur provenant du gabarit parent qui est utilisée. C’est toujours le contenu de la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> du gabarit parent qui est utilisé comme contenu par défaut.</p>\n<p>Vous pouvez utiliser autant de niveaux d’héritage que nécessaire. Une façon courante d’utiliser l’héritage est l’approche à trois niveaux suivante :</p>\n<ul class=\"simple\">\n<li><p>Créer un gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">base.html</span></code> contenant l’apparence principale du site.</p></li>\n<li><p>Créer un gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">base_NOMSECTION.html</span></code> pour chaque section du site. Par exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">base_actualites.html</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">base_sports.html</span></code>. Tous ces gabarits étendent <code class=\"docutils literal notranslate\"><span class=\"pre\">base.html</span></code> et contiennent le style et l’aspect spécifiques à la section.</p></li>\n<li><p>Créer des gabarits individuels pour chaque type de page, tel qu’un article d’actualité ou un article de blog. Ces gabarits étendent le gabarit de la section dans laquelle ils figurent.</p></li>\n</ul>\n<p>Cette approche maximise la réutilisation de code et facilite l’ajout d’éléments aux zones de contenu partagé, telle que la navigation propre à la section.</p>\n<p>Voici quelques astuces concernant l’héritage :</p>\n<ul>\n<li><p>Si vous utilisez <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-extends\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">%}</span></code></a> dans un gabarit, cela doit être la première balise dans ce gabarit. Sinon, l’héritage des gabarits ne fonctionnera pas.</p></li>\n<li><p>Ne soyez pas économe de balises <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code></a> dans vos gabarits de base. Rappelez-vous que les gabarits enfants ne doivent pas redéfinir tous les blocs du parent, vous pouvez donc placer du contenu généraliste dans certains blocs et ne redéfinir que ce qui est nécessaire dans les gabarits enfants. Il est préférable d’avoir trop de points d’insertion que d’en manquer.</p></li>\n<li><p>Si vous vous retrouvez à dupliquer du contenu dans plusieurs gabarits, cela signifie probablement que vous devriez placer ce contenu dans un <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> d’un gabarit parent.</p></li>\n<li><p>Si vous avez besoin de reproduire le contenu du bloc du gabarit parent, la variable <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">block.super</span> <span class=\"pre\">}}</span></code> fera l’affaire. C’est utile lorsque vous voulez compléter le contenu d’un bloc parent plutôt que de l’écraser simplement. Les données insérées par <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">block.super</span> <span class=\"pre\">}}</span></code> ne sont pas échappées automatiquement (voir la <a class=\"reference external\" href=\"#automatic-html-escaping\">section suivante</a>) puisqu’elles ont déjà été échappées dans le gabarit parent, si nécessaire.</p></li>\n<li><p>En utilisant le même nom de gabarit que celui dont vous héritez, <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-extends\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">%}</span></code></a> peut être utilisé pour hériter d’un gabarit tout en le surchargeant. Combiné avec <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">block.super</span> <span class=\"pre\">}}</span></code>, il s’agit d’un puissant moyen de faire de petits ajustements. Consultez <a class=\"reference internal\" href=\"/fr/5.2/howto/overriding-templates/#extending-an-overridden-template\"><span class=\"std std-ref\">Extension d’un gabarit surchargé</span></a> dans le guide de la <em>Surcharge de gabarits</em> pour voir un exemple complet.</p></li>\n<li><p>Les variables créées en dehors d’un bloc <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code></a> en utilisant la syntaxe de balise de gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">as</span></code> ne peuvent pas être utilisées à l’intérieur du bloc. Par exemple, ce gabarit ne produira rien du tout :</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\">translate</span> <span class=\"s2\">&quot;Title&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{{</span> <span class=\"nv\">title</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</li>\n<li><p>Pour une meilleure lisibilité, vous pouvez donner un <em>nom</em> à votre balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endblock</span> <span class=\"pre\">%}</span></code>. 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\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n...\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Dans les gros gabarits, cette technique permet de mieux voir quelle est la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code> que cette balise ferme.</p>\n</li>\n<li><p>Les balises <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">block</span> <span class=\"pre\">%}</span></code></a> sont évaluées en premier. C’est pourquoi le contenu d’un bloc est toujours écrasé, quelle que soit la valeur booléenne des balises environnantes. Par exemple, ce gabarit va <em>toujours</em> écraser le contenu du bloc <code class=\"docutils literal notranslate\"><span class=\"pre\">title</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\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">change_title</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>Hello!<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Pour terminer, notez que vous ne pouvez pas définir plusieurs balises <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> ayant le même nom dans le même gabarit. Cette restriction existe parce qu’une balise <code class=\"docutils literal notranslate\"><span class=\"pre\">block</span></code> fonctionne dans les « deux » sens. C’est-à-dire qu’une balise <code class=\"docutils literal notranslate\"><span class=\"pre\">block</span></code> ne fait pas que définir un vide à combler, elle définit aussi le contenu qui comble ce vide dans le <em>parent</em>. S’il y avait deux balises <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-block\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">block</span></code></a> ayant le même nom dans un gabarit, le parent de ce gabarit ne saurait pas de quel bloc le contenu doit être pris en compte.</p>\n</section>\n<section id=\"automatic-html-escaping\">\n<span id=\"id2\"></span><h2>Échappement HTML automatique<a class=\"heading-anchor\" href=\"#automatic-html-escaping\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lors de la production de HTML avec les gabarits, il y a toujours un risque qu’une variable inclue des caractères qui altèrent le HTML produit. Par exemple, considérez cet extrait de gabarit :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Hello, <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Au premier abord, cela semble une manière inoffensive d’afficher un nom d’utilisateur, mais imaginez ce qui se produit si l’utilisateur a saisi son nom comme ceci :</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=\"p\">&lt;</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span><span class=\"nx\">alert</span><span class=\"p\">(</span><span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">)&lt;/</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Avec cette valeur pour le nom, le gabarit serait produit comme ceci :</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>Hello, <span class=\"p\">&lt;</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span><span class=\"nx\">alert</span><span class=\"p\">(</span><span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">)&lt;/</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>… ce qui signifie que le navigateur afficherait une fenêtre d’alerte JavaScript !</p>\n<p>De la même manière, que se passe-t-il si le nom contient un symbole <code class=\"docutils literal notranslate\"><span class=\"pre\">'&lt;'</span></code> comme ceci ?</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</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=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>username\n</code></pre></div>\n<p>Cela aboutit à l’affichage d’un résultat de gabarit comme ceci :</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>Hello, <span class=\"p\">&lt;</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>username\n</code></pre></div>\n<p>…ce qui ferait que tout le reste de la page web serait affiché en gras !</p>\n<p>Clairement, il ne faut pas se fier aveuglément aux données envoyées par les utilisateurs en les insérant directement dans vos pages web, car un utilisateur malveillant pourrait exploiter ce genre de faille dans une mauvaise perspective. Ce type de faille de sécurité est appelé une attaque <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Cross-site_scripting\">Cross Site Scripting</a> (XSS).</p>\n<p>Pour éviter ce problème, vous avez deux options :</p>\n<ul class=\"simple\">\n<li><p>Premièrement, vous pouvez vous efforcer de faire passer ces variables non sécurisées par le filtre <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-escape\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">escape</span></code></a> (documenté ci-dessous), qui convertit les caractères HTML potentiellement dangereux en caractères inoffensifs. C’est la solution par défaut choisie par Django dans ses premières années, mais le problème est que la pression est sur <em>vous</em>, développeur ou auteur de gabarit, qui devez vous assurer que tout soit bien échappé. Il est très vite fait d’oublier d’échapper des données.</p></li>\n<li><p>Deuxièmement, vous pouvez profiter de l’échappement automatique de HTML que Django effectue. Le reste de cette section décrit le fonctionnement de l’échappement automatique.</p></li>\n</ul>\n<p>Par défaut dans Django, chaque gabarit échappe automatiquement le résultat de chaque balise de variable. Plus précisément, ces cinq caractères sont échappés :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;</span></code> est converti en <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;lt;</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&gt;</span></code> est converti en <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;gt;</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'</span></code> (apostrophe) est converti en <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;#x27;</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;</span></code> (guillemet) est converti en <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;quot;</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;</span></code> est converti en <code class=\"docutils literal notranslate\"><span class=\"pre\">&amp;amp;</span></code></p></li>\n</ul>\n<p>Nous répétons ici que ce comportement est actif par défaut. Si vous utilisez le système des gabarits de Django, vous êtes protégé.</p>\n<section id=\"how-to-turn-it-off\">\n<h3>Comment désactiver l’échappement automatique<a class=\"heading-anchor\" href=\"#how-to-turn-it-off\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous ne voulez pas que les données soient échappées automatiquement, au niveau d’un site, d’un gabarit ou d’une variable, vous pouvez le désactiver de plusieurs manières.</p>\n<p>Pourquoi vouloir désactiver ce comportement ? Parce qu’il peut arriver parfois que des variables de gabarit contiennent des données que vous voulez vraiment afficher comme contenu HTML brut, auquel cas vous ne souhaitez pas que ces contenus soient échappés. Par exemple, vous stockez peut-être du code HTML dans votre base de données afin de l’intégrer tel quel dans un gabarit. Un autre exemple est quand vous voulez utiliser le système des gabarits de Django pour produire du texte <em>non</em> HTML, comme un message électronique.</p>\n<section id=\"for-individual-variables\">\n<h4>Pour des variables individuelles<a class=\"heading-anchor\" href=\"#for-individual-variables\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour désactiver l’échappement automatique pour une variable individuelle, utilisez le filtre <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-safe\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">safe</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>This will be escaped: <span class=\"cp\">{{</span> <span class=\"nv\">data</span> <span class=\"cp\">}}</span>\nThis will not be escaped: <span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">safe</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">safe</span></code> (sûr en anglais) peut être considéré comme un raccourci de <em>sûr de ne pas nécessiter d’échappement</em> ou <em>peut être interprété en HTML de manière sûre</em>. Dans cet exemple, si <code class=\"docutils literal notranslate\"><span class=\"pre\">data</span></code> contient <code class=\"docutils literal notranslate\"><span class=\"pre\">'&lt;b&gt;'</span></code>, le résultat affiché sera :</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>This will be escaped: <span class=\"ni\">&amp;lt;</span>b<span class=\"ni\">&amp;gt;</span>\nThis will not be escaped: <span class=\"p\">&lt;</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"for-template-blocks\">\n<h4>Pour des blocs de gabarits<a class=\"heading-anchor\" href=\"#for-template-blocks\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour contrôler l’échappement automatique dans un gabarit, entourez le gabarit (ou une portion du gabarit) par la balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-autoescape\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">autoescape</span></code></a>, comme ceci :</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\">autoescape</span> <span class=\"nv\">off</span> <span class=\"cp\">%}</span>\n    Hello <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>La balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-autoescape\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">autoescape</span></code></a> accepte <code class=\"docutils literal notranslate\"><span class=\"pre\">on</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">off</span></code> comme paramètre. Il est parfois souhaitable de forcer l’échappement automatique dans un contexte où il est désactivé. Voici un exemple de gabarit :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Auto-escaping is on by default. Hello <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">autoescape</span> <span class=\"nv\">off</span> <span class=\"cp\">%}</span>\n    This will not be auto-escaped: <span class=\"cp\">{{</span> <span class=\"nv\">data</span> <span class=\"cp\">}}</span>.\n\n    Nor this: <span class=\"cp\">{{</span> <span class=\"nv\">other_data</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">autoescape</span> <span class=\"nv\">on</span> <span class=\"cp\">%}</span>\n        Auto-escaping applies again: <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>La balise d’échappement automatique transmet ses effets aux gabarits qui étendent le gabarit en cours ainsi qu’aux gabarits inclus par la balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-include\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">include</span></code></a>, comme pour toutes les balises de bloc. Par exemple :</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\">base.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\">autoescape</span> <span class=\"nv\">off</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\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\">child.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\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">title</span> <span class=\"cp\">%}</span>This <span class=\"ni\">&amp;amp;</span> that<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}{{</span> <span class=\"nv\">greeting</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></figure>\n<p>Comme l’échappement automatique est désactivé dans le gabarit de base, il sera aussi désactivé dans le gabarit enfant, ce qui aboutit par exemple au contenu HTML affiché suivant lorsque la variable <code class=\"docutils literal notranslate\"><span class=\"pre\">greeting</span></code> contient le texte <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;b&gt;Hello!&lt;/b&gt;</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=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>This <span class=\"ni\">&amp;amp;</span> that<span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>Hello!<span class=\"p\">&lt;/</span><span class=\"nt\">b</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"notes\">\n<h3>Notes<a class=\"heading-anchor\" href=\"#notes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Généralement, les rédacteurs de gabarits n’ont pas besoin de se préoccuper de l’échappement automatique. Les développeurs du côté Python (ceux qui écrivent les vues et les filtres personnalisés) doivent réfléchir aux situations dans lesquelles les données ne devraient pas subir d’échappement et marquer les données en conséquence, afin que tout fonctionne comme prévu dans les gabarits.</p>\n<p>Si vous créez un gabarit pouvant être utilisé dans des situations où vous n’êtes pas sûr si l’échappement automatique est actif, ajoutez le filtre <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-escape\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">escape</span></code></a> à toute variable nécessitant l’échappement. Quand l’échappement automatique est actif, il n’y a pas de risque que que le filtre <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-escape\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">escape</span></code></a> <em>échappe doublement</em> les données car celui-ci ne touche pas aux variables ayant déjà subi l’échappement automatique.</p>\n</section>\n<section id=\"string-literals-and-automatic-escaping\">\n<span id=\"id3\"></span><h3>Texte littéral et échappement automatique<a class=\"heading-anchor\" href=\"#string-literals-and-automatic-escaping\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Comme mentionné précédemment, les paramètres de filtres peuvent être des chaînes de caractères :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">default</span><span class=\"s2\">:&quot;This is a string literal.&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Tout texte littéral est inséré <strong>sans</strong> échappement automatique dans le gabarit, comme s’il était systématiquement passé par le filtre <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatefilter-safe\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">safe</span></code></a>. La logique de ce comportement est que l’auteur du gabarit a le contrôle sur le contenu du texte, il peut donc s’assurer que le texte est correctement échappé au moment de la rédaction du gabarit.</p>\n<p>Cela signifie qu’il faut écrire :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">default</span><span class=\"s2\">:&quot;3 &amp;lt; 2&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>…et non pas :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">default</span><span class=\"s2\">:&quot;3 &lt; 2&quot;</span> <span class=\"cp\">}}</span>  <span class=\"c\">{# Bad! Don&#39;t do this. #}</span>\n</code></pre></div>\n<p>Cela n’affecte pas les données provenant de la variable elle-même. Le contenu de la variable est toujours échappé automatiquement, si nécessaire, parce qu’il est hors du contrôle de l’auteur du gabarit.</p>\n</section>\n</section>\n<section id=\"accessing-method-calls\">\n<span id=\"template-accessing-methods\"></span><h2>Accès aux appels de méthodes<a class=\"heading-anchor\" href=\"#accessing-method-calls\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La plupart des appels de méthodes liées aux objets sont aussi disponibles depuis les gabarits. Cela signifie que les gabarits n’ont pas uniquement accès aux attributs de classe (comme les noms de champs) ou aux variables transmises depuis les vues. Par exemple, l’ORM de Django offre la syntaxe <a class=\"reference internal\" href=\"/fr/5.2/topics/db/queries/#topics-db-queries-related\"><span class=\"std std-ref\">« entry_set »</span></a> pour récupérer une collection d’objets liés par une clé étrangère. Ainsi, étant donné un modèle « comment » avec une relation clé étrangère vers un modèle « task », vous pouvez effectuer une boucle sur tous les commentaires liés à une tâche donnée comme ceci :</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\">for</span> <span class=\"nv\">comment</span> <span class=\"k\">in</span> <span class=\"nv\">task.comment_set.all</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">comment</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>De même, les objets <a class=\"reference internal\" href=\"/fr/5.2/ref/models/querysets/\"><span class=\"doc\">QuerySets</span></a> offrent une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> pour compter le nombre d’objets qu’ils contiennent. Vous pouvez donc obtenir le nombre de tous les commentaires liés à la tâche actuelle avec :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{{</span> <span class=\"nv\">task.comment_set.all.count</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Vous pouvez aussi accéder aux méthodes que vous avez explicitement définies pour vos propres modèles :</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\">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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Task</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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">foo</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;bar&quot;</span>\n</code></pre></figure>\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\">template.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=\"nv\">task.foo</span> <span class=\"cp\">}}</span>\n</code></pre></figure>\n<p>Comme Django limite intentionnellement les traitements logiques possibles dans le langage de gabarit, il n’est pas possible de transmettre des paramètres aux appels de méthodes depuis les gabarits. Les données doivent être calculées dans les vues, puis transmises aux gabarits pour être affichées.</p>\n</section>\n<section id=\"custom-tag-and-filter-libraries\">\n<span id=\"loading-custom-template-libraries\"></span><h2>Bibliothèques de balises et filtres personnalisés<a class=\"heading-anchor\" href=\"#custom-tag-and-filter-libraries\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Certaines applications contiennent leurs propres bibliothèques de balises et de filtres. Pour y accéder à partir d’un gabarit, vérifiez que l’application se trouve dans <a class=\"reference internal\" href=\"/fr/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> (nous aurions ajouté <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.humanize'</span></code> pour cet exemple), puis utilisez la balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">load</span></code></a> dans le gabarit :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">humanize</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{{</span> <span class=\"m\">45000</span><span class=\"o\">|</span><span class=\"nf\">intcomma</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Ci-dessus, la balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">load</span></code></a> charge la bibliothèque de balises <code class=\"docutils literal notranslate\"><span class=\"pre\">humanize</span></code>, ce qui permet ensuite d’utiliser le filtre <code class=\"docutils literal notranslate\"><span class=\"pre\">intcomma</span></code> dans le gabarit. Si <a class=\"reference internal\" href=\"/fr/5.2/ref/contrib/admin/admindocs/#module-django.contrib.admindocs\" title=\"django.contrib.admindocs: Django's admin documentation generator.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.admindocs</span></code></a> est activée, vous pouvez consulter la section de documentation de votre interface d’administration pour trouver la liste des bibliothèques personnalisées dans votre installation.</p>\n<p>La balise <a class=\"reference internal\" href=\"/fr/5.2/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">load</span></code></a> accepte plusieurs noms de bibliothèques séparés par des espaces. 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\">load</span> <span class=\"nv\">humanize</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Consultez <a class=\"reference internal\" href=\"/fr/5.2/howto/custom-template-tags/\"><span class=\"doc\">Création de balises et filtres de gabarit personnalisés</span></a> pour obtenir des informations sur l’écriture de vos propres bibliothèques de gabarits.</p>\n<section id=\"custom-libraries-and-template-inheritance\">\n<h3>Bibliothèques personnalisées et héritage de gabarits<a class=\"heading-anchor\" href=\"#custom-libraries-and-template-inheritance\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lorsque vous chargez une bibliothèque de balises ou de filtres, ces balises/filtres ne sont disponibles que pour le gabarit concerné, et pas pour les gabarits parents ou enfants dans la chaîne d’héritage des gabarits.</p>\n<p>Par exemple, si un gabarit <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.html</span></code> contient <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">humanize</span> <span class=\"pre\">%}</span></code>, un gabarit enfant (c’est-à-dire un gabarit contenant <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">extends</span> <span class=\"pre\">&quot;foo.html&quot;</span> <span class=\"pre\">%}</span></code>)  n’aura <em>pas</em> accès aux balises et filtres de gabarit de <code class=\"docutils literal notranslate\"><span class=\"pre\">humanize</span></code>. Le gabarit enfant est responsable de charger lui-même <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">humanize</span> <span class=\"pre\">%}</span></code>.</p>\n<p>C’est un comportement volontaire pour une meilleure maintenance et propreté du code.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<dl class=\"simple\">\n<dt><a class=\"reference internal\" href=\"/fr/5.2/ref/templates/\"><span class=\"doc\">La référence des gabarits</span></a></dt><dd><p>Documente les balises et filtres intégrés, l’utilisation d’un langage de gabarit alternatif, et d’autres choses encore.</p>\n</dd>\n</dl>\n</aside>\n</section>\n</section>","rootId":"the-django-template-language","toc":[{"title":"Gabarits","anchor":"templates","children":[]},{"title":"Variables","anchor":"variables","children":[]},{"title":"Filtres","anchor":"filters","children":[]},{"title":"Balises","anchor":"tags","children":[]},{"title":"Commentaires","anchor":"comments","children":[]},{"title":"Héritage de gabarits","anchor":"template-inheritance","children":[]},{"title":"Échappement HTML automatique","anchor":"automatic-html-escaping","children":[{"title":"Comment désactiver l’échappement automatique","anchor":"how-to-turn-it-off","children":[{"title":"Pour des variables individuelles","anchor":"for-individual-variables","children":[]},{"title":"Pour des blocs de gabarits","anchor":"for-template-blocks","children":[]}]},{"title":"Notes","anchor":"notes","children":[]},{"title":"Texte littéral et échappement automatique","anchor":"string-literals-and-automatic-escaping","children":[]}]},{"title":"Accès aux appels de méthodes","anchor":"accessing-method-calls","children":[]},{"title":"Bibliothèques de balises et filtres personnalisés","anchor":"custom-tag-and-filter-libraries","children":[{"title":"Bibliothèques personnalisées et héritage de gabarits","anchor":"custom-libraries-and-template-inheritance","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/5.2/ref/"},{"docname":"ref/templates/index","title":"Gabarits","url":"/fr/5.2/ref/templates/"}],"prev":{"docname":"ref/templates/index","title":"Gabarits","url":"/fr/5.2/ref/templates/"},"next":{"docname":"ref/templates/builtins","title":"Balises et filtres de gabarit intégrés","url":"/fr/5.2/ref/templates/builtins/"},"formats":{"html":"/fr/5.2/ref/templates/language/","markdown":"/fr/5.2/ref/templates/language.md","json":"/fr/5.2/ref/templates/language.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/templates/language.txt","official":"https://docs.djangoproject.com/fr/5.2/ref/templates/language/","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"]}