{"title":"Gabarits","version":"1.10","locale":"fr","docname":"topics/templates","url":"/fr/1.10/topics/templates/","canonical":"https://djangodocs.dev/fr/1.10/topics/templates/","summary":"Par sa nature liée au Web, Django a besoin d’un procédé agile de génération dynamique de HTML. L’approche la plus couramment utilisée est de se baser sur des…","html":"<span id=\"templates\"></span><h1>Gabarits<a class=\"heading-anchor\" href=\"#module-django.template\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Par sa nature liée au Web, Django a besoin d’un procédé agile de génération dynamique de HTML. L’approche la plus couramment utilisée est de se baser sur des gabarits. Un gabarit contient la partie statique du résultat HTML souhaité ainsi qu’une certaine syntaxe particulière définissant comment insérer le contenu dynamique. Pour un exemple pratique de création de pages HTML avec des gabarits, consultez la <a class=\"reference internal\" href=\"/fr/1.10/intro/tutorial03/\"><span class=\"doc\">partie 3 du tutoriel</span></a>.</p>\n<p>Un projet Django peut être configuré avec un ou plusieurs moteurs de gabarit (ou même aucun si vous n’utilisez pas de gabarit). Django est livré avec des moteurs intégrés pour son propre système de gabarits, appelé de manière originale le langage de gabarits de Django (DTL), ainsi que pour l’alternative répandue <a class=\"reference external\" href=\"http://jinja.pocoo.org/\">Jinja2</a>. Des moteurs pour d’autres langages de gabarits peuvent être mis à disposition par des applications tierces.</p>\n<p>Django définit une API standard pour le chargement et la production de gabarits de manière indépendante du moteur utilisé. Le chargement consiste à trouver le gabarit correspondant à un identifiant donné et à le pré-traiter, ce qui revient généralement à le compiler dans une représentation en mémoire. La production consiste à interpoler le gabarit en fonction de données de contexte et à renvoyer le texte résultant.</p>\n<p>Le <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/language/\"><span class=\"doc\">langage de gabarits de Django</span></a> est le système de gabarits propre à Django. Jusqu’à Django 1.8, il s’agissait de la seule option disponible. C’est une bonne bibliothèque de gabarit, même si son approche est parfois un peu rigide et présente quelques particularités. SI vous n’avez pas de motivation précise pour choisir un moteur différent, nous vous recommandons de travailler avec ce langage, à plus forte raison si vous écrivez une application réutilisable et que vous pensez distribuer des gabarits. Les applications contribuées de Django qui comprennent des gabarits, telle que <a class=\"reference internal\" href=\"/fr/1.10/ref/contrib/admin/\"><span class=\"doc\">django.contrib.admin</span></a>, utilisent le moteur de Django.</p>\n<p>Pour des raisons historiques, la prise en charge générique des moteurs de gabarit et l’implémentation du langage de gabarit de Django se trouvent tous deux dans l’espace de noms <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template</span></code>.</p>\n<section id=\"support-for-template-engines\">\n<span id=\"template-engines\"></span><h2>Prise en charge des moteurs de gabarit<a class=\"heading-anchor\" href=\"#support-for-template-engines\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"configuration\">\n<h3>Configuration<a class=\"heading-anchor\" href=\"#configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Les moteurs de gabarit sont configurés dans le réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a>. Il s’agit d’une liste de configurations, une par moteur. La valeur par défaut est vide. Le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> généré par la commande <a class=\"reference internal\" href=\"/fr/1.10/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startproject</span></code></a> définit une valeur plus utile :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.template.backends.django.DjangoTemplates&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;DIRS&#39;</span><span class=\"p\">:</span> <span class=\"p\">[],</span>\n        <span class=\"s1\">&#39;APP_DIRS&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ... some options here ...</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> est un chemin Python pointé vers ue classe de moteur de gabarit implémentant l’API de moteur de gabarit de Django. Les moteurs intégrés sont <a class=\"reference internal\" href=\"#django.template.backends.django.DjangoTemplates\" title=\"django.template.backends.django.DjangoTemplates\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.backends.django.DjangoTemplates</span></code></a> et <a class=\"reference internal\" href=\"#django.template.backends.jinja2.Jinja2\" title=\"django.template.backends.jinja2.Jinja2\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.backends.jinja2.Jinja2</span></code></a>.</p>\n<p>Comme la plupart des moteurs chargent des gabarits à partir de fichiers, la configuration de chaque moteur contient au premier niveau deux réglages courants :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> définit une liste de répertoires dans lesquels le moteur recherche des fichiers sources de gabarits, dans l’ordre de leur recherche.</p></li>\n<li><p><a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a> indique si le moteur doit rechercher les gabarits dans les applications installées. Chaque moteur définit un nom conventionnel à attribuer au sous-répertoire des applications où ses gabarits devraient se trouver.</p></li>\n</ul>\n<p>Même si ce n’est pas fréquent, il est possible de configurer plusieurs instances d’un même moteur avec des options différentes. Dans ce cas, il est nécessaire de définir un nom <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> unique pour chaque moteur.</p>\n<p><a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> contient des réglages spécifiques au moteur.</p>\n</section>\n<section id=\"usage\">\n<h3>Utilisation<a class=\"heading-anchor\" href=\"#usage\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p id=\"module-django.template.loader\"><span id=\"template-loading\"></span>Le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.loader</span></code> définit deux fonctions pour charger des gabarits.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.template.loader.get_template\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_template</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.loader.get_template\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cette fonction charge le gabarit ayant le nom donné et renvoie un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Template</span></code>.</p>\n<p>Le type exact de la valeur renvoyée dépend du moteur qui a chargé le gabarit. Chaque moteur possède sa propre classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Template</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">get_template()</span></code> essaie avec chaque moteur de gabarit dans l’ordre jusqu’à ce que l’un d’eux réussisse. Si le gabarit n’est pas trouvé, une exception <a class=\"reference internal\" href=\"#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TemplateDoesNotExist</span></code></a> est générée. Si le gabarit est trouvé mais contient une syntaxe non valable, une exception <a class=\"reference internal\" href=\"#django.template.TemplateSyntaxError\" title=\"django.template.TemplateSyntaxError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TemplateSyntaxError</span></code></a> est générée.</p>\n<p>La façon dont les gabarits sont recherchés et chargés dépend de chaque moteur et de sa configuration.</p>\n<p>Si vous souhaitez restreindre la recherche à un moteur de gabarit particulier, passez le nom <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> du moteur dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.template.loader.select_template\">\n<span class=\"sig-name descname\"><span class=\"pre\">select_template</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name_list</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.loader.select_template\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">select_template()</span></code> est semblable à <code class=\"docutils literal notranslate\"><span class=\"pre\">get_template()</span></code>, sauf qu’il accepte une liste de noms de gabarits. Il essaie chaque nom dans l’ordre et renvoie le premier gabarit existant.</p>\n</dd></dl>\n\n<p>Si le chargement d’un gabarit échoue, les deux exceptions suivantes définies dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template</span></code> peuvent être générées :</p>\n<dl class=\"py exception\">\n<dt class=\"sig sig-object py\" id=\"django.template.TemplateDoesNotExist\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">exception</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">TemplateDoesNotExist</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">msg</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">tried</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">backend</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">chain</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.TemplateDoesNotExist\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cette exception est générée lorsqu’aucun gabarit n’a pu être trouvé. Elle accepte les paramètres facultatifs suivants pour remplir le <a class=\"reference internal\" href=\"#template-postmortem\"><span class=\"std std-ref\">gabarit postmortem</span></a> sur la page de débogage :</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code></dt><dd><p>L’instance de moteur de gabarit dans lequel l’exception s’est produite.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">tried</span></code></dt><dd><p>Une liste de sources qui ont été parcourues pour la recherche du gabarit. Elle se trouve sous la forme d’une liste de tuples contenant <code class=\"docutils literal notranslate\"><span class=\"pre\">(origine,</span> <span class=\"pre\">statut)</span></code>, où <code class=\"docutils literal notranslate\"><span class=\"pre\">origine</span></code> est un objet de <a class=\"reference internal\" href=\"#template-origin-api\"><span class=\"std std-ref\">type origine</span></a> et <code class=\"docutils literal notranslate\"><span class=\"pre\">statut</span></code> est une chaîne contenant la raison expliquant l’absence du gabarit.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">chain</span></code></dt><dd><p>Une liste d’exceptions intermédiaires <a class=\"reference internal\" href=\"#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TemplateDoesNotExist</span></code></a> générées durant le chargement du gabarit. Ceci est exploité par des fonctions comme <a class=\"reference internal\" href=\"#django.template.loader.get_template\" title=\"django.template.loader.get_template\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_template()</span></code></a>, qui essaient de charger un gabarit donné depuis plusieurs moteurs.</p>\n</dd>\n</dl>\n<aside class=\"version-note version-added\" data-version=\"1.9\">\n<p class=\"version-note-title\">New in Django 1.9</p><p>Les paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">tried</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">chain</span></code> ont été ajoutés.</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py exception\">\n<dt class=\"sig sig-object py\" id=\"django.template.TemplateSyntaxError\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">exception</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">TemplateSyntaxError</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">msg</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.TemplateSyntaxError\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cette exception est générée lorsqu’un gabarit a été trouvé, mais qu’il contient des erreurs.</p>\n</dd></dl>\n\n<p>Les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">Template</span></code> renvoyés par <code class=\"docutils literal notranslate\"><span class=\"pre\">get_template()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">select_template()</span></code> doivent fournir une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> ayant la signature suivante :</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.template.backends.base.Template.render\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Template.</span></span><span class=\"sig-name descname\"><span class=\"pre\">render</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">context</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.backends.base.Template.render\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Produit ce gabarit en fonction du contexte donné.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> est fourni, il doit s’agir d’un <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">dict</span></code></a>. S’il n’est pas fourni, le moteur va produire le gabarit avec un contexte vide.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> est fourni, il doit s’agir d’un objet <a class=\"reference internal\" href=\"/fr/1.10/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>. Le moteur doit se charger ensuite de le rendre disponible, ainsi que le jeton CSRF, dans le gabarit. La manière de le faire dépend de chaque moteur.</p>\n</dd></dl>\n\n<p>Voici un exemple de l’algorithme de recherche. Pour cet exemple, le réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a> est :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">TEMPLATES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.template.backends.django.DjangoTemplates&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;DIRS&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s1\">&#39;/home/html/example.com&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;/home/html/default&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">],</span>\n    <span class=\"p\">},</span>\n    <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.template.backends.jinja2.Jinja2&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;DIRS&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s1\">&#39;/home/html/jinja2&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">],</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Si vous appelez <code class=\"docutils literal notranslate\"><span class=\"pre\">get_template('story_detail.html')</span></code>, voici les fichiers que Django va rechercher, dans l’ordre :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/example.com/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/default/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/jinja2/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'jinja2'</span></code>)</p></li>\n</ul>\n<p>Si vous appelez <code class=\"docutils literal notranslate\"><span class=\"pre\">select_template(['story_253_detail.html',</span> <span class=\"pre\">'story_detail.html'])</span></code>, voici ce que Django va rechercher :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/example.com/story_253_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/default/story_253_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/jinja2/story_253_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'jinja2'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/example.com/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/default/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/jinja2/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'jinja2'</span></code>)</p></li>\n</ul>\n<p>Lorsque Django trouve un gabarit existant, il stoppe sa recherche.</p>\n<aside class=\"admonition-tip admonition\">\n<p class=\"admonition-title\">Astuce</p>\n<p>Vous pouvez utiliser <a class=\"reference internal\" href=\"#django.template.loader.select_template\" title=\"django.template.loader.select_template\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">select_template()</span></code></a> pour une sélection agile des gabarits. Par exemple, si vous avez rédigé un article et que vous voulez pouvoir utiliser des gabarits spécifiques pour certains articles, utilisez quelque chose comme <code class=\"docutils literal notranslate\"><span class=\"pre\">select_template(['story_%s_detail.html'</span> <span class=\"pre\">%</span> <span class=\"pre\">story.id,</span> <span class=\"pre\">'story_detail.html'])</span></code>. Cela vous permet d’utiliser un gabarit adapté à un article individuel, tout en se rabattant sur un gabarit standard pour les articles sans gabarit dédié.</p>\n</aside>\n<p>Il est possible – et préférable – d’organiser les gabarits dans des sous-répertoires de chaque répertoire contenant des gabarits. La convention est de créer un sous-répertoire par application Django, en y ajoutant d’autres sous-répertoires au besoin.</p>\n<p>Ce conseil est tout à votre avantage. Le placement de tous les gabarits au niveau racine d’un seul répertoire devient rapidement ingérable.</p>\n<p>Pour charger un gabarit se trouvant dans un sous-répertoire, il suffit d’utiliser la barre oblique, comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s1\">&#39;news/story_detail.html&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Toujours avec le même réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEMPLATES</span></code></a> que ci-dessus, cet exemple va tenter de charger les gabarits suivants :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/example.com/news/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/default/news/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code>)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">/home/html/jinja2/news/story_detail.html</span></code> (moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">'jinja2'</span></code>)</p></li>\n</ul>\n<p>De plus, pour rationaliser l’aspect répétitif du chargement et de la production des gabarits, Django propose une fonction raccourci qui automatise le processus.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.template.loader.render_to_string\">\n<span class=\"sig-name descname\"><span class=\"pre\">render_to_string</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">context</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">using</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.template.loader.render_to_string\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">render_to_string()</span></code> charge un gabarit comme <a class=\"reference internal\" href=\"#django.template.loader.get_template\" title=\"django.template.loader.get_template\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_template()</span></code></a> et appelle sa méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code> immédiatement. Elle accepte les paramètres ci-après.</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code></dt><dd><p>Le nom d’un gabarit à charger et à produire. S’il s’agit d’une liste de noms de gabarits, Django utilise <a class=\"reference internal\" href=\"#django.template.loader.select_template\" title=\"django.template.loader.select_template\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">select_template()</span></code></a> au lieu de <a class=\"reference internal\" href=\"#django.template.loader.get_template\" title=\"django.template.loader.get_template\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_template()</span></code></a> pour chercher le gabarit.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code></dt><dd><p>Un <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">dict</span></code></a> à utiliser comme contexte de gabarit lors de la production.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code></dt><dd><p>Un objet <a class=\"reference internal\" href=\"/fr/1.10/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> facultatif qui sera disponible durant le processus de rendu du gabarit.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code></dt><dd><p>Un nom <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> de moteur de gabarit facultatif. La recherche de gabarit sera limitée à ce moteur.</p>\n</dd>\n</dl>\n<p>Exemple d’utilisation :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template.loader</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render_to_string</span>\n<span class=\"n\">rendered</span> <span class=\"o\">=</span> <span class=\"n\">render_to_string</span><span class=\"p\">(</span><span class=\"s1\">&#39;my_template.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">})</span>\n</code></pre></div>\n</dd></dl>\n\n<p>Voir aussi le raccourci <a class=\"reference internal\" href=\"/fr/1.10/topics/http/shortcuts/#django.shortcuts.render\" title=\"django.shortcuts.render\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">render()</span></code></a> qui appelle <a class=\"reference internal\" href=\"#django.template.loader.render_to_string\" title=\"django.template.loader.render_to_string\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">render_to_string()</span></code></a> et fournit le résultat à un objet <a class=\"reference internal\" href=\"/fr/1.10/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> prêt à être renvoyé depuis une vue.</p>\n<p>Finalement, vous pouvez utiliser directement des moteurs configurés :</p>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.template.loader.engines\">\n<span class=\"sig-name descname\"><span class=\"pre\">engines</span></span><a class=\"heading-anchor\" href=\"#django.template.loader.engines\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Les moteurs de gabarit sont disponibles dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.engines</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">engines</span>\n\n<span class=\"n\">django_engine</span> <span class=\"o\">=</span> <span class=\"n\">engines</span><span class=\"p\">[</span><span class=\"s1\">&#39;django&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">template</span> <span class=\"o\">=</span> <span class=\"n\">django_engine</span><span class=\"o\">.</span><span class=\"n\">from_string</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello {{ name }}!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>La clé de recherche, <code class=\"docutils literal notranslate\"><span class=\"pre\">'django'</span></code> dans cet exemple, correspond au réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> du moteur.</p>\n</dd></dl>\n\n</section>\n<section id=\"module-django.template.backends.django\">\n<span id=\"built-in-backends\"></span><span id=\"module-django.template.backends\"></span><h3>Moteurs intégrés<a class=\"heading-anchor\" href=\"#module-django.template.backends.django\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.template.backends.django.DjangoTemplates\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">DjangoTemplates</span></span><a class=\"heading-anchor\" href=\"#django.template.backends.django.DjangoTemplates\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Définissez <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.template.backends.django.DjangoTemplates'</span></code> pour configurer un moteur de gabarit de Django.</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les moteurs <code class=\"docutils literal notranslate\"><span class=\"pre\">DjangoTemplates</span></code> cherchent les gabarits dans le sous-répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">templates</span></code> des applications installées. Ce nom générique a été conservé par rétrocompatibilité.</p>\n<p>Les moteurs <code class=\"docutils literal notranslate\"><span class=\"pre\">DjangoTemplates</span></code> acceptent les <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> suivantes :</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'autoescape'</span></code>: une valeur booléenne contrôlant si l’auto-échappement HTML est activé.</p>\n<p>Sa valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Ne la mettez à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> que si vous produisez des gabarits non HTML !</p>\n</aside>\n<aside class=\"version-note version-added\" data-version=\"1.10\">\n<p class=\"version-note-title\">New in Django 1.10</p><p>L’option <code class=\"docutils literal notranslate\"><span class=\"pre\">autoescape</span></code> a été ajoutée.</p>\n</aside>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'context_processors'</span></code>: une liste de chemins Python pointés vers des objets exécutables utilisés pour remplir le contexte lorsqu’un gabarit est produit avec une requête. Ces exécutables acceptent un objet requête comme paramètre et renvoient un dictionnaire d’éléments à fusionner dans le contexte.</p>\n<p>La valeur par défaut est une liste vide.</p>\n<p>Voir <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.RequestContext\" title=\"django.template.RequestContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code></a> pour plus d’informations.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'debug'</span></code>: une valeur booléenne qui active ou désactive le mode débogage des gabarits. Quand elle vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, une page d’erreur élaborée affiche un rapport détaillé lors de toute exception générée durant le rendu des gabarits. Ce rapport contient les extraits concernés du gabarit avec les bonnes lignes mises en évidence.</p>\n<p>La valeur par défaut correspond à la valeur du réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a>.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'loaders'</span></code>: une liste de chemins Python pointés vers des classes de chargeurs de gabarits. Chaque classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Loader</span></code> sait comment importer les gabarits d’une source particulière. Il est possible d’indiquer des tuples au lieu de chaînes. Le premier élément du tuple correspond au nom de classe de <code class=\"docutils literal notranslate\"><span class=\"pre\">Loader</span></code> alors que les éléments suivants seront transmis à la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Loader</span></code> en vue de son initialisation.</p>\n<p>La valeur par défaut dépend des valeurs de <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> et de <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a>.</p>\n<p>Voir <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#template-loaders\"><span class=\"std std-ref\">Types de chargeurs</span></a> pour les détails.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'string_if_invalid'</span></code>: résultat, sous forme de chaîne de caractères, que le système des gabarits utilise pour remplacer le contenu de variables non valides (par ex. mal orthographiées).</p>\n<p>La valeur par défaut est une chaîne vide.</p>\n<p>Voir <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#invalid-template-variables\"><span class=\"std std-ref\">Traitement des variables non valides</span></a> pour les détails.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'file_charset'</span></code>: le jeu de caractères utilisé pour lire les fichiers de gabarits depuis le disque.</p>\n<p>La valeur par défaut est équivalente au réglage <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-FILE_CHARSET\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_CHARSET</span></code></a>.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'libraries'</span></code>: un dictionnaire d’étiquettes et de chemins Python pointés de modules de balises de gabarit à inscrire auprès du moteur de gabarit. Ceci peut être utilisé pour ajouter de nouvelles bibliothèques ou pour fournir des étiquettes alternatives à celles qui existent. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">OPTIONS</span><span class=\"o\">=</span><span class=\"p\">{</span>\n    <span class=\"s1\">&#39;libraries&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;myapp_tags&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;path.to.myapp.tags&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;admin.urls&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.contrib.admin.templatetags.admin_urls&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Les bibliothèques peuvent être chargées en passant la clé de dictionnaire correspondante à la balise <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">%}</span></code></a>.</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'builtins'</span></code>: une liste de chemins Python pointés de modules de balises de gabarit à ajouter aux <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/builtins/\"><span class=\"doc\">modules intégrés</span></a>. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">OPTIONS</span><span class=\"o\">=</span><span class=\"p\">{</span>\n    <span class=\"s1\">&#39;builtins&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;myapp.builtins&#39;</span><span class=\"p\">],</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Les balises et les filtres des bibliothèques intégrées peuvent être utilisés sans devoir d’abord faire appel à la balise <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/builtins/#std-templatetag-load\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">%}</span></code></a>.</p>\n</li>\n</ul>\n<aside class=\"version-note version-added\" data-version=\"1.9\">\n<p class=\"version-note-title\">New in Django 1.9</p><p>Les paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">libraries</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">builtins</span></code> ont été ajoutés.</p>\n</aside>\n<dl class=\"py class\" id=\"module-django.template.backends.jinja2\">\n<dt class=\"sig sig-object py\" id=\"django.template.backends.jinja2.Jinja2\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">Jinja2</span></span><a class=\"heading-anchor\" href=\"#django.template.backends.jinja2.Jinja2\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Nécessite que <a class=\"reference external\" href=\"http://jinja.pocoo.org/\">Jinja2</a> soit installé :</p>\n<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>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>Jinja2\n</code></pre></div>\n<p>Définissez <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.template.backends.jinja2.Jinja2'</span></code> pour configurer un moteur de gabarit <a class=\"reference external\" href=\"http://jinja.pocoo.org/\">Jinja2</a>.</p>\n<p>Lorsque <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les moteurs <code class=\"docutils literal notranslate\"><span class=\"pre\">Jinja2</span></code> cherchent les gabarits dans le sous-répertoire <code class=\"docutils literal notranslate\"><span class=\"pre\">jinja2</span></code> des applications installées.</p>\n<p>L’élément le plus important dans <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> est <code class=\"docutils literal notranslate\"><span class=\"pre\">'environment'</span></code>. Il s’agit d’un chemin Python pointé vers un objet exécutable renvoyant un environnement Jinja2. La valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">'jinja2.Environment'</span></code>. Django appelle cet objet et transmet d’autres options en tant que paramètres nommés. De plus, ajoute des valeurs par défaut qui diffèrent de celles de Jinja2 pour quelques-unes :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'autoescape'</span></code>: <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'loader'</span></code>: un chargeur configuré pour <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a> et <a class=\"reference internal\" href=\"/fr/1.10/ref/settings/#std-setting-TEMPLATES-APP_DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APP_DIRS</span></code></a></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'auto_reload'</span></code>: <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.DEBUG</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'undefined'</span></code>: <code class=\"docutils literal notranslate\"><span class=\"pre\">DebugUndefined</span></code> si <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.DEBUG</span></code> sinon <code class=\"docutils literal notranslate\"><span class=\"pre\">Undefined</span></code></p></li>\n</ul>\n<p>La configuration par défaut est volontairement limitée au minimum. Si un gabarit est produit avec une requête (par ex. en utilisant <a class=\"reference internal\" href=\"/fr/1.10/topics/http/shortcuts/#django.shortcuts.render\" title=\"django.shortcuts.render\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">render()</span></code></a>), le moteur <code class=\"docutils literal notranslate\"><span class=\"pre\">Jinja2</span></code> ajoute les éléments globaux <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">csrf_input</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">csrf_token</span></code> au contexte. À part ça, ce moteur ne crée pas d’environnement adapté à Django. Il n’a pas connaissance des processeurs de contexte, des filtres et des balises de Django. Afin de pouvoir utiliser des API spécifiques à Django, vous devez les configurer dans l’environnement.</p>\n<p>Par exemple, vous pouvez créer <code class=\"docutils literal notranslate\"><span class=\"pre\">monproject/jinja2.py</span></code> avec ce contenu :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">__future__</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">absolute_import</span>  <span class=\"c1\"># Python 2 only</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.staticfiles.storage</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">staticfiles_storage</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">jinja2</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Environment</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">environment</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">):</span>\n    <span class=\"n\">env</span> <span class=\"o\">=</span> <span class=\"n\">Environment</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">)</span>\n    <span class=\"n\">env</span><span class=\"o\">.</span><span class=\"n\">globals</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">({</span>\n        <span class=\"s1\">&#39;static&#39;</span><span class=\"p\">:</span> <span class=\"n\">staticfiles_storage</span><span class=\"o\">.</span><span class=\"n\">url</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;url&#39;</span><span class=\"p\">:</span> <span class=\"n\">reverse</span><span class=\"p\">,</span>\n    <span class=\"p\">})</span>\n    <span class=\"k\">return</span> <span class=\"n\">env</span>\n</code></pre></div>\n<p>et définir l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">'environment'</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">'monproject.jinja2.environment'</span></code>.</p>\n<p>Dès lors, vous pouvez utiliser les structures suivantes dans les gabarits Jinja2 :</p>\n<div class=\"code-block\" data-language=\"html+jinja\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html Jinja</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 Jinja code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">img</span> <span class=\"na\">src</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">static</span><span class=\"o\">(</span><span class=\"s1\">&#39;path/to/company-logo.png&#39;</span><span class=\"o\">)</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span> <span class=\"na\">alt</span><span class=\"o\">=</span><span class=\"s\">&quot;Company Logo&quot;</span><span class=\"p\">&gt;</span>\n\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\">url</span><span class=\"o\">(</span><span class=\"s1\">&#39;admin:index&#39;</span><span class=\"o\">)</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>Administration<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Les concepts de balises et filtres existent aussi bien dans le langage de gabarit de Django que dans Jinja2, mais ils sont utilisés différemment. Comme Jinja2 prend en charge le passage de paramètres à des objets exécutables dans les gabarits, beaucoup de fonctionnalités qui nécessitent une balise de gabarit ou un filtre dans les gabarits Django peuvent être implémentées simplement en appelant une fonction dans les gabarits Jinja2, comme l’exemple ci-dessus le montre. L’espace de noms global de Jinja2 élimine le besoin de processeurs de contexte de gabarit. Le langage de gabarit de Django ne possède pas d’équivalent aux tests Jinja2.</p>\n</section>\n<section id=\"custom-backends\">\n<h3>Moteurs personnalisés<a class=\"heading-anchor\" href=\"#custom-backends\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Voici comment implémenter un moteur de gabarit personnalisé afin d’utiliser un autre système de gabarits. Un moteur de gabarit est une classe qui hérite de <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.backends.base.BaseEngine</span></code>. Elle doit implémenter get_template()` et, facultativement, <code class=\"docutils literal notranslate\"><span class=\"pre\">from_string()</span></code>. Voici un exemple d’une bibliothèque de gabarit fictive <code class=\"docutils literal notranslate\"><span class=\"pre\">foobar</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateDoesNotExist</span><span class=\"p\">,</span> <span class=\"n\">TemplateSyntaxError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template.backends.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BaseEngine</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template.backends.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">csrf_input_lazy</span><span class=\"p\">,</span> <span class=\"n\">csrf_token_lazy</span>\n\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">foobar</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FooBar</span><span class=\"p\">(</span><span class=\"n\">BaseEngine</span><span class=\"p\">):</span>\n\n    <span class=\"c1\"># Name of the subdirectory containing the templates for this engine</span>\n    <span class=\"c1\"># inside an installed application.</span>\n    <span class=\"n\">app_dirname</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;foobar&#39;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"p\">):</span>\n        <span class=\"n\">params</span> <span class=\"o\">=</span> <span class=\"n\">params</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">()</span>\n        <span class=\"n\">options</span> <span class=\"o\">=</span> <span class=\"n\">params</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">(</span><span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">copy</span><span class=\"p\">()</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span><span class=\"n\">FooBar</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"n\">params</span><span class=\"p\">)</span>\n\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">engine</span> <span class=\"o\">=</span> <span class=\"n\">foobar</span><span class=\"o\">.</span><span class=\"n\">Engine</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">from_string</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">template_code</span><span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n          <span class=\"k\">return</span> <span class=\"n\">Template</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">engine</span><span class=\"o\">.</span><span class=\"n\">from_string</span><span class=\"p\">(</span><span class=\"n\">template_code</span><span class=\"p\">))</span>\n        <span class=\"k\">except</span> <span class=\"n\">foobar</span><span class=\"o\">.</span><span class=\"n\">TemplateCompilationFailed</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span><span class=\"n\">exc</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_template</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">template_name</span><span class=\"p\">):</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">Template</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">engine</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"n\">template_name</span><span class=\"p\">))</span>\n        <span class=\"k\">except</span> <span class=\"n\">foobar</span><span class=\"o\">.</span><span class=\"n\">TemplateNotFound</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">TemplateDoesNotExist</span><span class=\"p\">(</span><span class=\"n\">exc</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"n\">backend</span><span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"p\">)</span>\n        <span class=\"k\">except</span> <span class=\"n\">foobar</span><span class=\"o\">.</span><span class=\"n\">TemplateCompilationFailed</span> <span class=\"k\">as</span> <span class=\"n\">exc</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">TemplateSyntaxError</span><span class=\"p\">(</span><span class=\"n\">exc</span><span class=\"o\">.</span><span class=\"n\">args</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Template</span><span class=\"p\">(</span><span class=\"nb\">object</span><span class=\"p\">):</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">template</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">template</span> <span class=\"o\">=</span> <span class=\"n\">template</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">render</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"n\">context</span> <span class=\"ow\">is</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{}</span>\n        <span class=\"k\">if</span> <span class=\"n\">request</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s1\">&#39;request&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">request</span>\n            <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s1\">&#39;csrf_input&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">csrf_input_lazy</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n            <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s1\">&#39;csrf_token&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">csrf_token_lazy</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">template</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Voir <a class=\"reference external\" href=\"https://github.com/django/deps/blob/master/final/0182-multiple-template-engines.rst\">DEP 182</a> pour plus d’informations.</p>\n</section>\n<section id=\"debug-integration-for-custom-engines\">\n<span id=\"template-debug-integration\"></span><h3>Intégration du débogage pour les moteurs personnalisés<a class=\"heading-anchor\" href=\"#debug-integration-for-custom-engines\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"1.9\">\n<p class=\"version-note-title\">New in Django 1.9</p><p>L’intégration de la page de débogage pour les moteurs de gabarit non Django a été ajoutée.</p>\n</aside>\n<p>La page de débogage de Django présente des points d’entrée pour fournir des informations détaillées lorsqu’une erreur de gabarit se produit. Les moteurs de gabarit personnalisés peuvent utiliser ces points d’entrée pour améliorer les informations d’erreur qui sont présentées aux utilisateurs. Les points d’entrée suivants sont disponibles :</p>\n<section id=\"template-postmortem\">\n<span id=\"id1\"></span><h4>Gabarit postmortem<a class=\"heading-anchor\" href=\"#template-postmortem\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Le gabarit postmortem apparaît lorsque <a class=\"reference internal\" href=\"#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TemplateDoesNotExist</span></code></a> est générée. Il présente la liste des moteurs et chargeurs de gabarit utilisés lors de la recherche du gabarit concerné. Par exemple, si deux moteurs Django sont configurés, le gabarit postmortem ressemble à ceci :</p>\n<img alt=\"/fr/1.10/_images/postmortem.png\" src=\"/fr/1.10/_images/postmortem.png\" />\n<p>Les moteurs personnalisés peuvent remplir le gabarit postmortem en passant les paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">tried</span></code> lors de la génération de <a class=\"reference internal\" href=\"#django.template.TemplateDoesNotExist\" title=\"django.template.TemplateDoesNotExist\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">TemplateDoesNotExist</span></code></a>. Les moteurs qui utilisent le gabarit postmortem <a class=\"reference internal\" href=\"#template-origin-api\"><span class=\"std std-ref\">doivent indiquer une origine</span></a> sur l’objet de gabarit.</p>\n</section>\n<section id=\"contextual-line-information\">\n<h4>Information de ligne contextuelle<a class=\"heading-anchor\" href=\"#contextual-line-information\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Si une erreur se produit pendant l’analyse et le rendu d’un gabarit, Django peut afficher la ligne à laquelle s’est produite l’erreur. Par exemple :</p>\n<img alt=\"/fr/1.10/_images/template-lines.png\" src=\"/fr/1.10/_images/template-lines.png\" />\n<p>Les moteurs personnalisés peuvent fournir cette information en définissant un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">template_debug</span></code> sur les exceptions générées pendant l’analyse et le rendu. Cet attribut est un <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">dict</span></code></a> possédant les valeurs suivantes :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'name'</span></code>: le nom du gabarit dans lequel l’exception s’est produite.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'message'</span></code>: le message de l’exception.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'source_lines'</span></code>: les lignes précédentes, suivantes ainsi que la ligne elle-même où s’est produite l’exception. C’est pour fournir du contexte, il ne faut donc pas inclure plus d’une vingtaine de lignes.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'line'</span></code>: le numéro de ligne à laquelle s’est produite l’exception.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'before'</span></code>: le contenu de la ligne ayant provoqué l’erreur, avant le symbole qui a produit l’erreur.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'during'</span></code>: le symbole qui a généré l’erreur.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'after'</span></code>: le contenu de la ligne ayant provoqué l’erreur, après le symbole qui a produit l’erreur.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'total'</span></code>: le nombre de lignes dans <code class=\"docutils literal notranslate\"><span class=\"pre\">source_lines</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'top'</span></code>: le numéro de ligne où <code class=\"docutils literal notranslate\"><span class=\"pre\">source_lines</span></code> commence.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'bottom'</span></code>: le numéro de ligne où <code class=\"docutils literal notranslate\"><span class=\"pre\">source_lines</span></code> se termine.</p></li>\n</ul>\n<p>Étant donné l’erreur de gabarit ci-dessus, <code class=\"docutils literal notranslate\"><span class=\"pre\">template_debug</span></code> ressemblerait à ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span>\n    <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;/path/to/template.html&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Invalid block tag: &#39;syntax&#39;&quot;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;source_lines&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">&#39;some</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">&#39;lines</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">,</span> <span class=\"s1\">&#39;before</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Hello {</span><span class=\"si\">% s</span><span class=\"s1\">yntax error %} {{ world }}</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"s1\">&#39;some</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">6</span><span class=\"p\">,</span> <span class=\"s1\">&#39;lines</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">7</span><span class=\"p\">,</span> <span class=\"s1\">&#39;after</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"mi\">8</span><span class=\"p\">,</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n    <span class=\"s1\">&#39;line&#39;</span><span class=\"p\">:</span> <span class=\"mi\">4</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;before&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hello &#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;during&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;{</span><span class=\"si\">% s</span><span class=\"s1\">yntax error %}&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;after&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39; {{ world }}</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;total&#39;</span><span class=\"p\">:</span> <span class=\"mi\">9</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;bottom&#39;</span><span class=\"p\">:</span> <span class=\"mi\">9</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;top&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"origin-api-and-3rd-party-integration\">\n<span id=\"template-origin-api\"></span><h4>API d’origine et intégration tierce<a class=\"heading-anchor\" href=\"#origin-api-and-3rd-party-integration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les gabarits Django possèdent un objet <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.base.Origin\" title=\"django.template.base.Origin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Origin</span></code></a> accessible par leur attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">template.origin</span></code>. Ceci permet aux informations de débogage d’apparaître dans le <a class=\"reference internal\" href=\"#template-postmortem\"><span class=\"std std-ref\">gabarit postmortem</span></a>, de même que dans des bibliothèques tierces, telle que <a class=\"reference external\" href=\"https://github.com/django-debug-toolbar/django-debug-toolbar\">Django Debug Toolbar</a>.</p>\n<p>Les moteurs personnalisés peuvent fournir leurs propres informations <code class=\"docutils literal notranslate\"><span class=\"pre\">template.origin</span></code> en créant un objet qui définit les attributs suivants :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'name'</span></code>: le chemin complet vers le gabarit.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'template_name'</span></code>: le chemin relatif vers le gabarit tel que transmis aux méthodes de chargement de gabarits.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'loader_name'</span></code>: une chaîne facultative identifiant la fonction ou la classe utilisée pour charger le gabarit, par exemple <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.loaders.filesystem.Loader</span></code>.</p></li>\n</ul>\n</section>\n</section>\n</section>\n<section id=\"the-django-template-language\">\n<span id=\"template-language-intro\"></span><h2>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></h2>\n<section id=\"syntax\">\n<h3>Syntaxe<a class=\"heading-anchor\" href=\"#syntax\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition-about-this-section admonition\">\n<p class=\"admonition-title\">À propos de cette section</p>\n<p>Il s’agit ici d’un aperçu de la syntaxe du langage de gabarit de Django. Pour plus de détails, voir la <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/language/\"><span class=\"doc\">référence de la syntaxe du langage</span></a>.</p>\n</aside>\n<p>Un gabarit Django est un simple document texte ou un chaîne Python, balisés à l’aide du langage de gabarit de Django. Certaines structures sont reconnues et interprétées par le moteur de gabarit. Les principales sont les variables et les balises.</p>\n<p>Un gabarit est produit avec un contexte. Le processus de production remplace les variables par leurs valeurs qui sont cherchées dans le contexte, et il exécute les balises. Tout le reste est affiché tel quel.</p>\n<p>La syntaxe du langage de gabarit de Django implique quatre structures.</p>\n<section id=\"variables\">\n<h4>Variables<a class=\"heading-anchor\" href=\"#variables\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Une variable affiche une valeur à partir du contexte, qui est un objet de type dictionnaire faisant correspondre des clés à des valeurs.</p>\n<p>Les variables sont entourées par <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">}}</span></code> 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>My first name is <span class=\"cp\">{{</span> <span class=\"nv\">first_name</span> <span class=\"cp\">}}</span>. My last name is <span class=\"cp\">{{</span> <span class=\"nv\">last_name</span> <span class=\"cp\">}}</span>.\n</code></pre></div>\n<p>Avec un contexte <code class=\"docutils literal notranslate\"><span class=\"pre\">{'first_name':</span> <span class=\"pre\">'John',</span> <span class=\"pre\">'last_name':</span> <span class=\"pre\">'Doe'}</span></code>, ce gabarit produit :</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>My first name is John. My last name is Doe.\n</code></pre></div>\n<p>La consultation de dictionnaire, d’attribut et d’indice de liste est implémentée par une notation pointée :</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\">my_dict.key</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{{</span> <span class=\"nv\">my_object.attribute</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{{</span> <span class=\"nv\">my_list.0</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Si le contenu d’une variable s’avère être un objet exécutable, le système de gabarit l’appelle sans paramètre et utilise son résultat à la place de l’objet exécutable.</p>\n</section>\n<section id=\"tags\">\n<h4>Balises<a class=\"heading-anchor\" href=\"#tags\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les balises permettent d’appliquer une logique arbitraire dans le processus de rendu.</p>\n<p>Cette définition est volontairement vague. Par exemple, une balise peut produire du contenu, servir de structure de contrôle telle qu’une instruction « if » ou une boucle « for », extraire du contenu d’une base de données ou même de donner accès à d’autres balises de gabarit.</p>\n<p>Les balises sont entourées par <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">%}</span></code>, 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\">csrf_token</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>La plupart des balises acceptent des paramètres :</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\">cycle</span> <span class=\"s1\">&#39;odd&#39;</span> <span class=\"s1\">&#39;even&#39;</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Certaines balises exigent des balises d’introduction et de terminaison :</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\">user.is_authenticated</span> <span class=\"cp\">%}</span>Hello, <span class=\"cp\">{{</span> <span class=\"nv\">user.username</span> <span class=\"cp\">}}</span>.<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Une <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/builtins/#ref-templates-builtins-tags\"><span class=\"std std-ref\">référence des balises intégrés</span></a> est disponible tout comme des <a class=\"reference internal\" href=\"/fr/1.10/howto/custom-template-tags/#howto-writing-custom-template-tags\"><span class=\"std std-ref\">instructions pour écrire des balises personnalisées</span></a>.</p>\n</section>\n<section id=\"filters\">\n<h4>Filtres<a class=\"heading-anchor\" href=\"#filters\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les filtres transforment les valeurs de variables et les paramètres de balises.</p>\n<p>Ils ressemblent à 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=\"nv\">django</span><span class=\"o\">|</span><span class=\"nf\">title</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Avec un contexte <code class=\"docutils literal notranslate\"><span class=\"pre\">{'django':</span> <span class=\"pre\">'the</span> <span class=\"pre\">web</span> <span class=\"pre\">framework</span> <span class=\"pre\">for</span> <span class=\"pre\">perfectionists</span> <span class=\"pre\">with</span> <span class=\"pre\">deadlines'}</span></code>, ce gabarit produit le résultat suivant :</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>The Web Framework For Perfectionists With Deadlines\n</code></pre></div>\n<p>Certains filtres acceptent un paramètre :</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\">my_date</span><span class=\"o\">|</span><span class=\"nf\">date</span><span class=\"s2\">:&quot;Y-m-d&quot;</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Une <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/builtins/#ref-templates-builtins-filters\"><span class=\"std std-ref\">référence des filtres intégrés</span></a> est disponible tout comme des <a class=\"reference internal\" href=\"/fr/1.10/howto/custom-template-tags/#howto-writing-custom-template-filters\"><span class=\"std std-ref\">instructions pour écrire des filtres personnalisés</span></a>.</p>\n</section>\n<section id=\"comments\">\n<h4>Commentaires<a class=\"heading-anchor\" href=\"#comments\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les commentaires ressemblent à 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=\"c\">{# this won&#39;t be rendered #}</span>\n</code></pre></div>\n<p>Une balise <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">comment</span> <span class=\"pre\">%}</span></code></a> autorise des commentaires sur plusieurs lignes.</p>\n</section>\n</section>\n<section id=\"components\">\n<h3>Composants<a class=\"heading-anchor\" href=\"#components\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition-about-this-section admonition\">\n<p class=\"admonition-title\">À propos de cette section</p>\n<p>Il s’agit ici d’un aperçu des API du langage de gabarit de Django. Pour plus de détails, voir la <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/\"><span class=\"doc\">référence des API</span></a>.</p>\n</aside>\n<section id=\"engine\">\n<h4>Moteur<a class=\"heading-anchor\" href=\"#engine\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Engine\" title=\"django.template.Engine\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.Engine</span></code></a> encapsule une instance du système de gabarit de Django. La raison principale de créer directement une telle instance est d’utiliser le langage de gabarit de Django en dehors d’un projet Django.</p>\n<p><a class=\"reference internal\" href=\"#django.template.backends.django.DjangoTemplates\" title=\"django.template.backends.django.DjangoTemplates\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.backends.django.DjangoTemplates</span></code></a> est un adaptateur léger autour de <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Engine\" title=\"django.template.Engine\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.Engine</span></code></a> pour l’adapter à l’API de moteur de gabarit de Django.</p>\n</section>\n<section id=\"template\">\n<h4>Gabarit<a class=\"heading-anchor\" href=\"#template\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Template\" title=\"django.template.Template\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.Template</span></code></a> représente un gabarit compilé. Les gabarits sont obtenus par <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Engine.get_template\" title=\"django.template.Engine.get_template\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Engine.get_template()</span></code></a> ou <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Engine.from_string\" title=\"django.template.Engine.from_string\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Engine.from_string()</span></code></a></p>\n<p>De même, <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.backends.django.Template</span></code> est un adaptateur léger autour de <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Template\" title=\"django.template.Template\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.Template</span></code></a> pour l’adapter à l’API de gabarit commune.</p>\n</section>\n<section id=\"context\">\n<h4>Contexte<a class=\"heading-anchor\" href=\"#context\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Context\" title=\"django.template.Context\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.Context</span></code></a> contient des métadonnées en plus des données de contexte. Il est transmis à <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Template.render\" title=\"django.template.Template.render\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Template.render()</span></code></a> en vue de la production d’un gabarit.</p>\n<p><a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.RequestContext\" title=\"django.template.RequestContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.RequestContext</span></code></a> est une sous-classe de <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Context\" title=\"django.template.Context\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Context</span></code></a> qui stocke la requête <a class=\"reference internal\" href=\"/fr/1.10/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> en cours et exécute les processeurs de contexte de gabarit.</p>\n<p>L’API commune ne possède pas de concept équivalent. Les données de contexte sont transmises dans un simple <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">dict</span></code></a> et la requête <a class=\"reference internal\" href=\"/fr/1.10/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> en cours est transmise séparément si nécessaire.</p>\n</section>\n<section id=\"loaders\">\n<h4>Chargeurs<a class=\"heading-anchor\" href=\"#loaders\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les chargeurs de gabarits sont responsables de la découverte des gabarits, de leur chargement et du renvoi d’objets <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#django.template.Template\" title=\"django.template.Template\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Template</span></code></a>.</p>\n<p>Django fournit plusieurs <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#template-loaders\"><span class=\"std std-ref\">chargeurs de gabarits intégrés</span></a> et prend en charge des <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#custom-template-loaders\"><span class=\"std std-ref\">chargeurs de gabarits personnalisés</span></a>.</p>\n</section>\n<section id=\"context-processors\">\n<h4>Processeurs de contexte<a class=\"heading-anchor\" href=\"#context-processors\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Les processeurs de contexte sont des fonctions qui reçoivent la requête <a class=\"reference internal\" href=\"/fr/1.10/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> en cours comme paramètre et renvoient un <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#dict\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">dict</span></code></a> de données à ajouter au contexte de production.</p>\n<p>Leur utilisation principale est d’ajouter dans le contexte des données fréquemment utilisées partagées par tous les gabarits, sans devoir répéter le code correspondant dans chaque vue.</p>\n<p>Django fournit un bon nombre de <a class=\"reference internal\" href=\"/fr/1.10/ref/templates/api/#context-processors\"><span class=\"std std-ref\">processeurs de contexte intégrés</span></a>. L’implémentation d’un processeur de contexte personnalisé est aussi simple que de définir une fonction.</p>\n</section>\n</section>\n</section>","rootId":"module-django.template","toc":[{"title":"Prise en charge des moteurs de gabarit","anchor":"support-for-template-engines","children":[{"title":"Configuration","anchor":"configuration","children":[]},{"title":"Utilisation","anchor":"usage","children":[]},{"title":"Moteurs intégrés","anchor":"module-django.template.backends.django","children":[]},{"title":"Moteurs personnalisés","anchor":"custom-backends","children":[]},{"title":"Intégration du débogage pour les moteurs personnalisés","anchor":"debug-integration-for-custom-engines","children":[{"title":"Gabarit postmortem","anchor":"template-postmortem","children":[]},{"title":"Information de ligne contextuelle","anchor":"contextual-line-information","children":[]},{"title":"API d’origine et intégration tierce","anchor":"origin-api-and-3rd-party-integration","children":[]}]}]},{"title":"Le langage de gabarit de Django","anchor":"the-django-template-language","children":[{"title":"Syntaxe","anchor":"syntax","children":[{"title":"Variables","anchor":"variables","children":[]},{"title":"Balises","anchor":"tags","children":[]},{"title":"Filtres","anchor":"filters","children":[]},{"title":"Commentaires","anchor":"comments","children":[]}]},{"title":"Composants","anchor":"components","children":[{"title":"Moteur","anchor":"engine","children":[]},{"title":"Gabarit","anchor":"template","children":[]},{"title":"Contexte","anchor":"context","children":[]},{"title":"Chargeurs","anchor":"loaders","children":[]},{"title":"Processeurs de contexte","anchor":"context-processors","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/1.10/topics/"}],"prev":{"docname":"topics/forms/media","title":"Fichiers annexes de formulaire (classe Media)","url":"/fr/1.10/topics/forms/media/"},"next":{"docname":"topics/class-based-views/index","title":"Vues fondées sur les classes","url":"/fr/1.10/topics/class-based-views/"},"formats":{"html":"/fr/1.10/topics/templates/","markdown":"/fr/1.10/topics/templates.md","json":"/fr/1.10/topics/templates.json"},"source":"https://github.com/django/django/blob/stable/1.10.x/docs/topics/templates.txt","official":"https://docs.djangoproject.com/fr/1.10/topics/templates/","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","fr","ja","id","pt-br","es","el","pl"]}