{"title":"L’API des formulaires","version":"2.0","locale":"fr","docname":"ref/forms/api","url":"/fr/2.0/ref/forms/api/","canonical":"https://djangodocs.dev/fr/2.0/ref/forms/api/","summary":"À propos de ce document Ce document aborde en détails l’API des formulaires de Django. Il est recommandé de lire d’abord l” introduction à l’utilisation des…","html":"<span id=\"the-forms-api\"></span><h1>L’API des formulaires<a class=\"heading-anchor\" href=\"#module-django.forms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"admonition-about-this-document admonition\">\n<p class=\"admonition-title\">À propos de ce document</p>\n<p>Ce document aborde en détails l’API des formulaires de Django. Il est recommandé de lire d’abord l”<a class=\"reference internal\" href=\"/fr/2.0/topics/forms/\"><span class=\"doc\">introduction à l’utilisation des formulaires</span></a>.</p>\n</aside>\n<section id=\"bound-and-unbound-forms\">\n<span id=\"ref-forms-api-bound-unbound\"></span><h2>Formulaires liés et non liés<a class=\"heading-anchor\" href=\"#bound-and-unbound-forms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> est soit <strong>liée</strong> (bound) à un jeu de données, soit <strong>non liée</strong> (unbound).</p>\n<ul class=\"simple\">\n<li><p>Si elle est <strong>liée</strong> à un jeu de données, elle est capable de valider ces données et d’afficher un formulaire en HTML en y incluant les données.</p></li>\n<li><p>Si elle est <strong>non liée</strong>, elle ne peut pas procéder à la validation (car il n’y a aucune donnée à valider !), mais elle peut tout de même afficher un formulaire HTML vierge.</p></li>\n</ul>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form\">\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\">Form</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Pour créer une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> non liée, il suffit d’instancier la classe :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>Pour lier des données au formulaire, transmettez ces données sous forme de dictionnaire comme premier paramètre au constructeur de la classe <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Dans ce dictionnaire, les clés sont les noms de champs qui correspondent aux attributs de la classe <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a>. Les valeurs sont les données que vous souhaitez valider. Il s’agit en principe de chaînes de caractères, mais ce n’est pas une obligation. Le type des données transmises dépend du champ <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a>, comme nous allons le voir dans un moment.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.is_bound\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">is_bound</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.is_bound\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Si vous avez besoin de faire la différence entre des instances de formulaires liés et non liés au moment de l’exécution, vous pouvez vous baser sur l’attribut <a class=\"reference internal\" href=\"#django.forms.Form.is_bound\" title=\"django.forms.Form.is_bound\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">is_bound</span></code></a> du formulaire :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_bound</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">({</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_bound</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>Notez que le fait de transmettre un dictionnaire vide crée un formulaire <em>lié</em> avec des données vides :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">({})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_bound</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>Si vous souhaitez modifier d’une quelconque manière les données d’une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> liée ou si vous aimeriez lier une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> non liée à certaines données, créez une nouvelle instance de <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a>. Il n’est pas possible de modifier les données dans une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a>. Dès qu’une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> a été créée, ses données doivent être considérées comme immuables, que les données existent ou non.</p>\n</section>\n<section id=\"using-forms-to-validate-data\">\n<h2>Utilisation de formulaires pour valider des données<a class=\"heading-anchor\" href=\"#using-forms-to-validate-data\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.clean\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">clean</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.clean\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>L’implémentation d’une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">clean()</span></code> pour un formulaire se justifie lorsque de la validation personnalisée est nécessaire pour des champs interdépendants. Voir <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/validation/#validating-fields-with-clean\"><span class=\"std std-ref\">Nettoyage et validation de champs qui dépendent l’un de l’autre</span></a> pour des exemples d’utilisation.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.is_valid\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">is_valid</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.is_valid\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>La tâche principale d’un objet <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> est de valider des données. Disposant d’une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> liée, appelez la méthode <a class=\"reference internal\" href=\"#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code></a> pour procéder à la validation et renvoyer une valeur booléenne indiquant si les données sont valides :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>Essayons avec certaines données non valides. Dans ce cas, <code class=\"docutils literal notranslate\"><span class=\"pre\">subject</span></code> est vide (ce qui constitue une erreur, car tous les champs sont obligatoires par défaut) et <code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code> n’est pas une adresse électronique valable :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;invalid email address&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.errors\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">errors</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.errors\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Accédez à l’attribut <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">errors</span></code></a> pour obtenir un dictionnaire des messages d’erreur :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">{&#39;sender&#39;: [&#39;Enter a valid email address.&#39;], &#39;subject&#39;: [&#39;This field is required.&#39;]}</span>\n</code></pre></div>\n<p>Dans ce dictionnaire, les clés correspondent aux noms de champs et les valeurs à des listes de chaînes représentant les messages d’erreur. Ceux-ci sont stockés dans des listes car un champ peut générer plusieurs messages d’erreur.</p>\n<p>Vous pouvez accéder à <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">errors</span></code></a> sans devoir appeler d’abord <a class=\"reference internal\" href=\"#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code></a>. Les données du formulaire seront validées lors du premier appel à <a class=\"reference internal\" href=\"#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code></a> ou du premier accès à <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">errors</span></code></a>.</p>\n<p>Les routines de validation ne sont appelées qu’une seule fois, même si vous appelez plusieurs fois <a class=\"reference internal\" href=\"#django.forms.Form.is_valid\" title=\"django.forms.Form.is_valid\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">is_valid()</span></code></a> ou que vous accédez plusieurs fois à <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">errors</span></code></a>. Cela signifie que si la validation provoque des effets de bord, ceux-ci ne sont produits qu’une seule fois.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.errors.as_data\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.errors.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_data</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.errors.as_data\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie un dictionnaire faisant correspondre les champs à leur instance <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> originale.</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"o\">.</span><span class=\"n\">as_data</span><span class=\"p\">()</span>\n<span class=\"go\">{&#39;sender&#39;: [ValidationError([&#39;Enter a valid email address.&#39;])],</span>\n<span class=\"go\">&#39;subject&#39;: [ValidationError([&#39;This field is required.&#39;])]}</span>\n</code></pre></div>\n<p>Utilisez cette méthode chaque fois qu’il y a besoin d’identifier une erreur par son <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code>. Cela permet des choses telles que la réécriture du message d’erreur ou l’écriture d’une logique personnalisée dans une vue lorsqu’une erreur donnée est présente. Elle peut également être utilisée pour sérialiser les erreurs dans un format personnalisé (par ex. XML) ; par exemple, <a class=\"reference internal\" href=\"#django.forms.Form.errors.as_json\" title=\"django.forms.Form.errors.as_json\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_json()</span></code></a> se base sur <code class=\"docutils literal notranslate\"><span class=\"pre\">as_data()</span></code>.</p>\n<p>La nécessité de la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">as_data()</span></code> s’explique par la rétrocompatibilité. Précédemment, les instances <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> étaient perdues dès le moment où leurs messages d’erreur étaient ajoutés dans leur état <strong>rendu</strong> au dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">Form.errors</span></code>. Idéalement, <code class=\"docutils literal notranslate\"><span class=\"pre\">Form.errors</span></code> aurait dû stocker les instances <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> et des méthodes préfixées par <code class=\"docutils literal notranslate\"><span class=\"pre\">as_</span></code> auraient pu produire leur rendu final, mais il a fallu procéder d’une manière inverse afin de ne pas casser du code qui s’attendait à trouver des messages d’erreur « finaux » dans <code class=\"docutils literal notranslate\"><span class=\"pre\">Form.errors</span></code>.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.errors.as_json\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.errors.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_json</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">escape_html</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.errors.as_json\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Renvoie les erreurs sérialisées en JSON.</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"o\">.</span><span class=\"n\">as_json</span><span class=\"p\">()</span>\n<span class=\"go\">{&quot;sender&quot;: [{&quot;message&quot;: &quot;Enter a valid email address.&quot;, &quot;code&quot;: &quot;invalid&quot;}],</span>\n<span class=\"go\">&quot;subject&quot;: [{&quot;message&quot;: &quot;This field is required.&quot;, &quot;code&quot;: &quot;required&quot;}]}</span>\n</code></pre></div>\n<p>Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">as_json()</span></code> n’échappe pas son contenu. Si vous l’utilisez dans un contexte comme des requêtes AJAX vers une vue de formulaire où le client interprète la réponse et insère les erreurs dans la page, il faut vous assurer de bien échapper le contenu du côté client pour éviter l’éventualité d’une attaque de script intersite. C’est une opération triviale avec une bibliothèque JavaScript comme jQuery, il suffit d’utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">$(el).text(errorText)</span></code> plutôt que <code class=\"docutils literal notranslate\"><span class=\"pre\">.html()</span></code>.</p>\n<p>Si pour une raison précise vous ne souhaitez pas utiliser l’échappement du côté client, vous pouvez aussi définir <code class=\"docutils literal notranslate\"><span class=\"pre\">escape_html=True</span></code> et les messages d’erreur seront échappés afin de pouvoir les utiliser directement en HTML.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.errors.get_json_data\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.errors.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_json_data</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">escape_html</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.errors.get_json_data\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<aside class=\"version-note version-added\" data-version=\"2.0\">\n<p class=\"version-note-title\">New in Django 2.0</p></aside>\n<p>Renvoie les erreurs sous forme de dictionnaire prêt à être sérialisé en JSON. <a class=\"reference internal\" href=\"#django.forms.Form.errors.as_json\" title=\"django.forms.Form.errors.as_json\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.errors.as_json()</span></code></a> renvoie du JSON sérialisé, alors que cette methode renvoie les données d’erreur avant leur sérialisation.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">escape_html</span></code> possède le même comportement que pour <a class=\"reference internal\" href=\"#django.forms.Form.errors.as_json\" title=\"django.forms.Form.errors.as_json\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.errors.as_json()</span></code></a>.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.add_error\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_error</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">error</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.add_error\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Cette méthode permet d’ajouter des erreurs à des champs spécifiques depuis la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">Form.clean()</span></code> elle-même ou carrément depuis l’extérieur du formulaire, par exemple depuis une vue.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">field</span></code> est le nom du champ auquel les erreurs seront attribuées. Si sa valeur est <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, l’erreur est traitée comme une erreur non liée à un champ, et fera partie des erreurs renvoyées par <a class=\"reference internal\" href=\"#django.forms.Form.non_field_errors\" title=\"django.forms.Form.non_field_errors\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.non_field_errors()</span></code></a>.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">error</span></code> peut être une simple chaîne ou de préférence une instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code>. Consultez <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/validation/#raising-validation-error\"><span class=\"std std-ref\">Génération de ValidationError</span></a> pour des conseils de bonnes pratiques lors de la définition d’erreurs de formulaire.</p>\n<p>Notez que <code class=\"docutils literal notranslate\"><span class=\"pre\">Form.add_error()</span></code> enlève automatiquement les champs correspondants du dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code>.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.has_error\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">has_error</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">code</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.forms.Form.has_error\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Cette méthode renvoie une valeur booléenne indiquant si un champ contient une erreur avec un <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> d’erreur spécifique. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, la méthode renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> si le champ contient n’importe quelle erreur.</p>\n<p>Pour vérifier la présence d’erreurs non liées aux champs, indiquez <a class=\"reference internal\" href=\"/fr/2.0/ref/exceptions/#django.core.exceptions.NON_FIELD_ERRORS\" title=\"django.core.exceptions.NON_FIELD_ERRORS\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">NON_FIELD_ERRORS</span></code></a> dans le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">field</span></code>.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.non_field_errors\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">non_field_errors</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.non_field_errors\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Cette méthode renvoie la liste des erreurs dans <a class=\"reference internal\" href=\"#django.forms.Form.errors\" title=\"django.forms.Form.errors\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Form.errors</span></code></a> qui ne sont pas associées à un champ particulier. Cela comprend les erreurs <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> qui sont générées dans <a class=\"reference internal\" href=\"#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.clean()</span></code></a> et les erreurs ajoutées par <a class=\"reference internal\" href=\"#django.forms.Form.add_error\" title=\"django.forms.Form.add_error\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Form.add_error(None,</span> <span class=\"pre\">&quot;...&quot;)</span></code></a>.</p>\n<section id=\"behavior-of-unbound-forms\">\n<h3>Comportement des formulaires non liés<a class=\"heading-anchor\" href=\"#behavior-of-unbound-forms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Il n’y a pas de raison de vouloir valider un formulaire sans données, mais pour que cela soit dit, voici ce qui se passe avec des formulaires non liés :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">{}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"dynamic-initial-values\">\n<h2>Valeurs initiales dynamiques<a class=\"heading-anchor\" href=\"#dynamic-initial-values\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.initial\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">initial</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.initial\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Le paramètre <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">initial</span></code></a> permet de déclarer des valeurs initiales des champs de formulaire au moment de l’exécution. Par exemple, il peut être intéressant de pré-remplir un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">username</span></code> avec le nom d’utilisateur de la session en cours.</p>\n<p>Pour faire cela, utilisez le paramètre <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">initial</span></code></a> d’une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a>. Quand il est présent, ce paramètre doit être un dictionnaire faisant correspondre des noms de champs à des valeurs initiales. N’incluez que les champs pour lesquels une valeur initiale existe ; il n’est pas nécessaire d’inclure tous les champs du formulaire. 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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there!&#39;</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Ces valeurs ne sont affichées que pour les formulaires non liés et elles ne servent pas à fournir des valeurs par défaut si un champ particulier n’est pas renseigné.</p>\n<p>Si un champ <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> définit <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field.initial\" title=\"django.forms.Field.initial\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">initial</span></code></a> <em>et</em> que vous incluez <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">initial</span></code></a> lors de la création du formulaire, c’est ce dernier qui prend le dessus. Dans cet exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">initial</span></code> est renseigné à la fois au niveau du champ et au niveau de l’instance de formulaire, et c’est ce dernier qui a la priorité :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CommentForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"s1\">&#39;class&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>    <span class=\"n\">url</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">URLField</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span>    <span class=\"n\">comment</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">CommentForm</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;instance&#39;</span><span class=\"p\">},</span> <span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Name:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;instance&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Url:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;url&quot; name=&quot;url&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Comment:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;comment&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.get_initial_for_field\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_initial_for_field</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.get_initial_for_field\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<aside class=\"version-note version-added\" data-version=\"1.11\">\n<p class=\"version-note-title\">New in Django 1.11</p></aside>\n<p>Utilisez <a class=\"reference internal\" href=\"#django.forms.Form.get_initial_for_field\" title=\"django.forms.Form.get_initial_for_field\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_initial_for_field()</span></code></a> pour récupérer les données initiales d’un champ de formulaire. Les données sont prises dans <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Form.initial</span></code></a> et <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field.initial\" title=\"django.forms.Field.initial\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.initial</span></code></a>, dans cet ordre, et évalue toute valeur initiale exécutable, le cas échéant.</p>\n</section>\n<section id=\"checking-which-form-data-has-changed\">\n<h2>Contrôle des données de formulaires modifiées<a class=\"heading-anchor\" href=\"#checking-which-form-data-has-changed\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.has_changed\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">has_changed</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.has_changed\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Lorsque vous avez besoin de savoir quelles données de formulaire ont été modifiées en référence aux données initiales, utilisez la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">has_changed()</span></code> du formulaire.</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">has_changed</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n<p>Lorsque le formulaire est envoyé, il est reconstruit et les données d’origine sont fournies afin que la comparaison puisse être faite :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">has_changed</span><span class=\"p\">()</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">has_changed()</span></code> renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> si les données de <code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST</span></code> diffèrent de celles qui ont été fournies dans <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">initial</span></code></a>, sinon elle renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. Le résultat est produit en appelant <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field.has_changed\" title=\"django.forms.Field.has_changed\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Field.has_changed()</span></code></a> pour chaque champ du formulaire.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.changed_data\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">changed_data</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.changed_data\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>L’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">changed_data</span></code> renvoie une liste des noms de champs dont les valeurs dans les données liées au formulaire (habituellement <code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST</span></code>) diffèrent de celles fournies initialement dans <a class=\"reference internal\" href=\"#django.forms.Form.initial\" title=\"django.forms.Form.initial\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">initial</span></code></a>. La liste renvoyée est vide si les données sont parfaitement identiques.</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">if</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">has_changed</span><span class=\"p\">():</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;The following fields changed: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"s2\">&quot;, &quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">changed_data</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"accessing-the-fields-from-the-form\">\n<h2>Accès aux champs depuis le formulaire<a class=\"heading-anchor\" href=\"#accessing-the-fields-from-the-form\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.fields\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">fields</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.fields\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Vous pouvez accéder aux champs d’une instance de <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> depuis son attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</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=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">row</span> <span class=\"ow\">in</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">fields</span><span class=\"o\">.</span><span class=\"n\">values</span><span class=\"p\">():</span> <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">row</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">&lt;django.forms.fields.CharField object at 0x7ffaac632510&gt;</span>\n<span class=\"go\">&lt;django.forms.fields.URLField object at 0x7ffaac632f90&gt;</span>\n<span class=\"go\">&lt;django.forms.fields.CharField object at 0x7ffaac3aa050&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">fields</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span>\n<span class=\"go\">&lt;django.forms.fields.CharField object at 0x7ffaac6324d0&gt;</span>\n</code></pre></div>\n<p>Vous pouvez modifier un champ d’une instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> pour changer la façon dont il sera affiché dans le formulaire :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">&#39;&lt;tr&gt;&lt;th&gt;Name:&lt;/th&gt;&lt;td&gt;&lt;input name=&quot;name&quot; type=&quot;text&quot; value=&quot;instance&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">fields</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">label</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Username&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">&#39;&lt;tr&gt;&lt;th&gt;Username:&lt;/th&gt;&lt;td&gt;&lt;input name=&quot;name&quot; type=&quot;text&quot; value=&quot;instance&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;&#39;</span>\n</code></pre></div>\n<p>Faites attention de ne pas modifier l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">base_fields</span></code> car cette modification influencerait toutes les instances <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code> suivantes à l’intérieur du même processus Python :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">base_fields</span><span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">label</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Username&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">another_f</span> <span class=\"o\">=</span> <span class=\"n\">CommentForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">another_f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">split</span><span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"se\">\\n</span><span class=\"s1\">&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">&#39;&lt;tr&gt;&lt;th&gt;Username:&lt;/th&gt;&lt;td&gt;&lt;input name=&quot;name&quot; type=&quot;text&quot; value=&quot;class&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"accessing-clean-data\">\n<h2>Accès aux données « nettoyées »<a class=\"heading-anchor\" href=\"#accessing-clean-data\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.cleaned_data\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">cleaned_data</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.cleaned_data\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Chaque champ d’une classe <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> a non seulement la responsabilité de valider ses données, mais aussi de les « nettoyer », c’est-à-dire les normaliser dans un format cohérent. C’est une fonction bien utile, parce que cela permet de saisir les données d’un champ de plusieurs manières, tout en conservant une cohérence au niveau de la donnée résultante.</p>\n<p>Par exemple, <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateField</span></code></a> normalise les saisies en un objet Python <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime.date</span></code>. Que le contenu transmis soit une chaîne au format <code class=\"docutils literal notranslate\"><span class=\"pre\">'1994-07-15'</span></code>, un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime.date</span></code> ou un autre format encore, <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> transformera toujours ce contenu en objet <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime.date</span></code>, pour autant qu’il soit valide.</p>\n<p>Après avoir créé une instance de <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> avec un jeu de données et l’avoir validé, il est possible d’accéder aux données nettoyées par son attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span>\n<span class=\"go\">{&#39;cc_myself&#39;: True, &#39;message&#39;: &#39;Hi there&#39;, &#39;sender&#39;: &#39;foo@example.com&#39;, &#39;subject&#39;: &#39;hello&#39;}</span>\n</code></pre></div>\n<p>Notez que tout champ basé sur du texte, tel que <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">EmailField</span></code>, nettoie toujours le contenu saisi pour en faire une chaîne de caractères. Nous aborderons les implications du codage plus loin dans ce document.</p>\n<p>Si vos données ne sont <em>pas</em> toutes valides, le dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> ne contient que les champs valides :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;invalid email address&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span>\n<span class=\"go\">{&#39;cc_myself&#39;: True, &#39;message&#39;: &#39;Hi there&#39;}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> ne contient toujours que des clés correspondant à des champs définis dans le formulaire, même si vous lui transmettez des données supplémentaires lors de la création du formulaire. Dans cet exemple, nous transmettons des données de champs supplémentaires au constructeur de <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code>, mais <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> ne contient que les données correspondant aux champs du formulaire :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;extra_field_1&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;extra_field_2&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;bar&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;extra_field_3&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;baz&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span> <span class=\"c1\"># Doesn&#39;t contain extra_field_1, etc.</span>\n<span class=\"go\">{&#39;cc_myself&#39;: True, &#39;message&#39;: &#39;Hi there&#39;, &#39;sender&#39;: &#39;foo@example.com&#39;, &#39;subject&#39;: &#39;hello&#39;}</span>\n</code></pre></div>\n<p>Lorsque le formulaire est valide, <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> inclut une clé et une valeur pour <em>tous</em> ses champs, même si les données ne contenaient pas de valeur pour certains champs facultatifs. Dans cet exemple, le dictionnaire de données ne contient pas de valeur pour le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">nick_name</span></code>, mais <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> l’intègre tout de même, avec une valeur vide :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">OptionalPersonForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span>    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span>    <span class=\"n\">nick_name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">required</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;John&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;last_name&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Lennon&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">OptionalPersonForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">()</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">cleaned_data</span>\n<span class=\"go\">{&#39;nick_name&#39;: &#39;&#39;, &#39;first_name&#39;: &#39;John&#39;, &#39;last_name&#39;: &#39;Lennon&#39;}</span>\n</code></pre></div>\n<p>Dans l’exemple ci-dessus, la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">cleaned_data</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">nick_name</span></code> correspond à une chaîne vide, car <code class=\"docutils literal notranslate\"><span class=\"pre\">nick_name</span></code>  est un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code>, et ces champs considèrent la chaîne vide comme une valeur vide. Chaque type de champ connaît sa valeur vide, par exemple <code class=\"docutils literal notranslate\"><span class=\"pre\">DateField</span></code> emploie <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> au lieu de la chaîne vide. Pour plus de détails sur le comportement de chaque champ dans ce cas de figure, consultez la rubrique « Valeur vide » de chaque champ dans la section « Classes <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> intégrées » ci-dessous.</p>\n<p>Il est possible d’écrire du code pour effectuer la validation de certains champs de formulaires (en fonction de leur nom) ou pour le formulaire entier (prenant en compte la combinaison de différents champs). Vous trouverez davantage d’informations à ce sujet dans <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/validation/\"><span class=\"doc\">La validation de formulaires et de champs</span></a>.</p>\n</section>\n<section id=\"outputting-forms-as-html\">\n<span id=\"ref-forms-api-outputting-html\"></span><h2>Affichage des formulaires en HTML<a class=\"heading-anchor\" href=\"#outputting-forms-as-html\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La seconde tâche d’un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> est de s’afficher lui-même au format HTML. Pour faire cela, il suffit de l’afficher avec <code class=\"docutils literal notranslate\"><span class=\"pre\">print</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<p>Si le formulaire est lié à des données, le résultat HTML contiendra ces données comme il se doit. Par exemple, si un champ est représenté par un composant <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;text&quot;&gt;</span></code>, les données figureront dans l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code>. Si un champ est représenté par un composant <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;checkbox&quot;&gt;</span></code>, le HTML produit contiendra <code class=\"docutils literal notranslate\"><span class=\"pre\">checked</span></code> le cas échéant :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; value=&quot;hello&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; value=&quot;Hi there&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; value=&quot;foo@example.com&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; checked /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"1.11\">\n<p class=\"version-note-title\">Changed in Django 1.11</p><p>L’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">checked</span></code> a été modifié afin d’utiliser la syntaxe booléenne de HTML 5 au lieu de <code class=\"docutils literal notranslate\"><span class=\"pre\">checked=&quot;checked&quot;</span></code>.</p>\n</aside>\n<p>Ce résultat par défaut est un tableau HTML à deux colonnes, avec une ligne <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;tr&gt;</span></code> par champ. Notez ceci :</p>\n<ul class=\"simple\">\n<li><p>Pour des raisons d’agilité, le résultat ne contient <em>pas</em> les balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;table&gt;</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;/table&gt;</span></code>, ni les balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;form&gt;</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;/form&gt;</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;submit&quot;&gt;</span></code>. C’est à vous de les fournir.</p></li>\n<li><p>Chaque type de champ possède une représentation HTML par défaut. <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code> est représenté par <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;text&quot;&gt;</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">EmailField</span></code> par <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;email&quot;&gt;</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">BooleanField</span></code> est représenté par <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;checkbox&quot;&gt;</span></code>. Notez qu’il ne s’agit que de valeurs par défaut raisonnables ; il est possible de définir le code HTML produit par un champ spécifique en utilisant des composants, ce que nous expliquerons tout à l’heure.</p></li>\n<li><p>Le nom <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> HTML de chaque balise est directement dérivé de son nom d’attribut dans la classe <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code>.</p></li>\n<li><p>L’étiquette textuelle de chaque champ (par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">'Subject:'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'Message:'</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">'Cc</span> <span class=\"pre\">myself:'</span></code>) est généré à partir du nom de champ en convertissant tous les soulignements en espaces et en mettant en majuscule la première lettre. Encore une fois, il ne s’agit que de valeurs par défaut plus ou moins adéquates ; vous pouvez aussi définir ces étiquettes manuellement.</p></li>\n<li><p>Chaque étiquette textuelle est intégrée dans une balise HTML <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> qui se réfère à son champ de formulaire par son attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code>. La valeur de celui-ci est générée en ajoutant le préfixe <code class=\"docutils literal notranslate\"><span class=\"pre\">'id_'</span></code> au nom du champ. Les attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> et les balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> sont compris dans le HTML produit par défaut pour être conforme aux bonnes pratiques, mais vous pouvez modifier ce comportement.</p></li>\n<li><p>Le résultat utilise la syntaxe HTML5, avec l’en-tête <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;!DOCTYPE</span> <span class=\"pre\">html&gt;</span></code>. Par exemple, les attributs booléens tels que <code class=\"docutils literal notranslate\"><span class=\"pre\">checked</span></code> sont préférés au style XHTML <code class=\"docutils literal notranslate\"><span class=\"pre\">checked='checked'</span></code>.</p></li>\n</ul>\n<p>Bien que le résultat sous forme de <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;table&gt;</span></code> soit le style de résultat par défaut lorsqu’on affiche un formulaire avec <code class=\"docutils literal notranslate\"><span class=\"pre\">print</span></code>, d’autres styles de résultat sont disponibles. Chaque style est disponible par une méthode de l’objet formulaire et chaque méthode de rendu renvoie une chaîne.</p>\n<section id=\"as-p\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">as_p()</span></code><a class=\"heading-anchor\" href=\"#as-p\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.as_p\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_p</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.as_p\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">as_p()</span></code> produit le formulaire par une série de balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;p&gt;</span></code>, chacune contenant un champ :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_p</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;&lt;p&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/p&gt;\\n&lt;p&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;&lt;/p&gt;\\n&lt;p&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required /&gt;&lt;/p&gt;\\n&lt;p&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; /&gt;&lt;/p&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_p</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; /&gt;&lt;/p&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"as-ul\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">as_ul()</span></code><a class=\"heading-anchor\" href=\"#as-ul\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.as_ul\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_ul</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.as_ul\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">as_ul()</span></code> produit le formulaire par une série de balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;li&gt;</span></code>, chacune contenant un champ. Les balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;ul&gt;</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;/ul&gt;</span></code> ne sont pas comprises, ce qui vous donne la flexibilité de définir vous-même des attributs à la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;ul&gt;</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;&lt;li&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;\\n&lt;li&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;&lt;/li&gt;\\n&lt;li&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required /&gt;&lt;/li&gt;\\n&lt;li&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; /&gt;&lt;/li&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; /&gt;&lt;/li&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"as-table\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">as_table()</span></code><a class=\"heading-anchor\" href=\"#as-table\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.as_table\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_table</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.as_table\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Pour terminer, <code class=\"docutils literal notranslate\"><span class=\"pre\">as_table()</span></code> produit le formulaire dans une balise HTML <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;table&gt;</span></code>. C’est le même résultat qu’en l’affichant avec <code class=\"docutils literal notranslate\"><span class=\"pre\">print</span></code>. En fait, lorsqu’un objet formulaire est affiché avec <code class=\"docutils literal notranslate\"><span class=\"pre\">print</span></code>, c’est sa méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">as_table()</span></code> qui est appelée en arrière-plan :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;\\n&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;\\n&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;\\n&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"styling-required-or-erroneous-form-rows\">\n<span id=\"ref-forms-api-styling-form-rows\"></span><h3>Ajout de styles aux lignes de formulaire obligatoires ou erronées<a class=\"heading-anchor\" href=\"#styling-required-or-erroneous-form-rows\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.error_css_class\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">error_css_class</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.error_css_class\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.required_css_class\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">required_css_class</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.required_css_class\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Il est assez fréquent de devoir définir des styles particuliers s’appliquant aux lignes et champs de formulaire qui sont obligatoires ou qui contiennent des erreurs. Par exemple, on pourrait afficher en gras les lignes de formulaire obligatoires et afficher les erreurs en rouge.</p>\n<p>La classe <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> offre plusieurs points d’entrée permettant d’ajouter des attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span></code> aux lignes obligatoires ou aux lignes avec des erreurs : il suffit de compléter les attributs <a class=\"reference internal\" href=\"#django.forms.Form.error_css_class\" title=\"django.forms.Form.error_css_class\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Form.error_css_class</span></code></a> et <a class=\"reference internal\" href=\"#django.forms.Form.required_css_class\" title=\"django.forms.Form.required_css_class\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Form.required_css_class</span></code></a></p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">error_css_class</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;error&#39;</span>\n    <span class=\"n\">required_css_class</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;required&#39;</span>\n\n    <span class=\"c1\"># ... and the rest of your fields here</span>\n</code></pre></div>\n<p>Après avoir fait cela, les classes <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;error&quot;</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;required&quot;</span></code> seront attribuées aux lignes correspondantes. Le code HTML ressemblera à quelque chose comme :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;tr class=&quot;required&quot;&gt;&lt;th&gt;&lt;label class=&quot;required&quot; for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;    ...</span>\n<span class=\"go\">&lt;tr class=&quot;required&quot;&gt;&lt;th&gt;&lt;label class=&quot;required&quot; for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;    ...</span>\n<span class=\"go\">&lt;tr class=&quot;required error&quot;&gt;&lt;th&gt;&lt;label class=&quot;required&quot; for=&quot;id_sender&quot;&gt;Sender:&lt;/label&gt;      ...</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_cc_myself&quot;&gt;Cc myself:&lt;label&gt; ...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">label_tag</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;label class=&quot;required&quot; for=&quot;id_subject&quot;&gt;Subject:&lt;/label&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">label_tag</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&lt;label for=&quot;id_subject&quot; class=&quot;foo required&quot;&gt;Subject:&lt;/label&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"configuring-form-elements-html-id-attributes-and-label-tags\">\n<span id=\"ref-forms-api-configuring-label\"></span><h3>Configuration des attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> et des balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> dans le code HTML des formulaires<a class=\"heading-anchor\" href=\"#configuring-form-elements-html-id-attributes-and-label-tags\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.auto_id\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">auto_id</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.auto_id\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Par défaut, les méthodes de rendu HTML des formulaires comprennent :</p>\n<ul class=\"simple\">\n<li><p>Les attributs HTML <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> des éléments de formulaire.</p></li>\n<li><p>Les balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> autour des étiquettes de champ. Une balise HTML <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> détermine quel texte descriptif est associé à un élément de formulaire. Cette petite amélioration rend les formulaires plus conviviaux et mieux adaptés aux techniques d’accessibilité. Il est recommandé de toujours utiliser des balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code>.</p></li>\n</ul>\n<p>Les valeurs d’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> sont générées en préfixant les noms de champ de formulaire par <code class=\"docutils literal notranslate\"><span class=\"pre\">id_</span></code>. Ce mécanisme peut cependant être configuré si vous souhaitez modifier la convention <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> ou supprimer complètement les attributs HTML <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> ou les balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code>.</p>\n<p>Utilisez le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_id</span></code> du constructeur de <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> pour contrôler le comportement <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code>. Ce paramètre doit valoir <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> ou contenir une chaîne.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_id</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, le rendu HTML du formulaire ne contiendra par de balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> ni d’attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">id</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Subject:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Message:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Sender:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Cc myself:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Cc myself: &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; /&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_p</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Cc myself: &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; /&gt;&lt;/p&gt;</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_id</span></code> est défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, le rendu HTML du formulaire <em>contiendra</em> des balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> et utilisera le nom du champ comme identifiant <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> pour chaque champ de formulaire :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;message&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;sender&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;cc_myself&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;message&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;sender&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;cc_myself&quot; /&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_p</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;message&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;sender&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;cc_myself&quot; /&gt;&lt;/p&gt;</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_id</span></code> est défini à une chaîne contenant le caractère de format <code class=\"docutils literal notranslate\"><span class=\"pre\">'%s'</span></code>, le rendu HTML du formulaire contiendra des balises <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> et produira des attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> en fonction de la chaîne de format. Par exemple, compte tenu d’une chaîne de format <code class=\"docutils literal notranslate\"><span class=\"pre\">'champ_%s'</span></code>, l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> d’un champ nommé``sujet``  sera <code class=\"docutils literal notranslate\"><span class=\"pre\">'champ_sujet'</span></code>. En poursuivant notre 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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"s1\">&#39;id_for_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself:&lt;/label&gt;&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot; /&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_p</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject:&lt;/label&gt; &lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender:&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself:&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot; /&gt;&lt;/p&gt;</span>\n</code></pre></div>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_id</span></code> est défini à toute autre valeur évaluée à la valeur « vrai », comme par exemple une chaîne ne contenant pas de <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code>, la bibliothèque va considérer que <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_id</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_id</span></code> contient la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">'id_%s'</span></code>.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.label_suffix\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label_suffix</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.label_suffix\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Une chaîne traduisible (en anglais, la valeur par défaut est deux-points (<code class=\"docutils literal notranslate\"><span class=\"pre\">:</span></code>)) qui sera ajoutée à chaque nom d’étiquette lors du rendu HTML d’un formulaire.</p>\n<p>Il est possible de personnaliser ce caractère ou de l’omettre entièrement en utilisant le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">label_suffix</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"s1\">&#39;id_for_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">,</span> <span class=\"n\">label_suffix</span><span class=\"o\">=</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject&lt;/label&gt; &lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot; /&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"s1\">&#39;id_for_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">,</span> <span class=\"n\">label_suffix</span><span class=\"o\">=</span><span class=\"s1\">&#39; -&gt;&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_subject&quot;&gt;Subject -&gt;&lt;/label&gt; &lt;input id=&quot;id_for_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_message&quot;&gt;Message -&gt;&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_for_message&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_sender&quot;&gt;Sender -&gt;&lt;/label&gt; &lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_for_sender&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_for_cc_myself&quot;&gt;Cc myself -&gt;&lt;/label&gt; &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_for_cc_myself&quot; /&gt;&lt;/li&gt;</span>\n</code></pre></div>\n<p>Notez que le suffixe d’étiquette n’est ajouté que si le dernier caractère de l’étiquette n’est pas un caractère de ponctuation (en anglais, il s’agit de <code class=\"docutils literal notranslate\"><span class=\"pre\">.</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">!</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">?</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">:</span></code>).</p>\n<p>Les champs peuvent aussi définir leur propre <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field.label_suffix\" title=\"django.forms.Field.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">label_suffix</span></code></a>. Cette définition a la priorité sur <a class=\"reference internal\" href=\"#django.forms.Form.label_suffix\" title=\"django.forms.Form.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Form.label_suffix</span></code></a>. Le suffixe peut aussi être surchargé au cours de l’exécution en utilisant le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">label_suffix</span></code> de <a class=\"reference internal\" href=\"#django.forms.BoundField.label_tag\" title=\"django.forms.BoundField.label_tag\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">label_tag()</span></code></a>.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.use_required_attribute\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">use_required_attribute</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.use_required_attribute\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Si défini à <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> (par défaut), les champs de formulaire obligatoires possèdent l’attribut HTML <code class=\"docutils literal notranslate\"><span class=\"pre\">required</span></code>.</p>\n<p>Les <a class=\"reference internal\" href=\"/fr/2.0/topics/forms/formsets/\"><span class=\"doc\">formulaires groupés</span></a> créent leurs formulaires avec <code class=\"docutils literal notranslate\"><span class=\"pre\">use_required_attribute=False</span></code> pour éviter la validation incorrecte des navigateurs lors de l’ajout ou de la suppression de formulaires dans des formulaires groupés.</p>\n</section>\n<section id=\"configuring-the-rendering-of-a-form-s-widgets\">\n<h3>Configuration du rendu des composants de formulaires<a class=\"heading-anchor\" href=\"#configuring-the-rendering-of-a-form-s-widgets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.default_renderer\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">default_renderer</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.default_renderer\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<aside class=\"version-note version-added\" data-version=\"1.11\">\n<p class=\"version-note-title\">New in Django 1.11</p></aside>\n<p>Indique le <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/renderers/\"><span class=\"doc\">moteur de rendu</span></a> à utiliser pour le formulaire. Vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> par défaut, ce qui signifie que le moteur de rendu par défaut défini dans le réglage <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-FORM_RENDERER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FORM_RENDERER</span></code></a> sera utilisé.</p>\n<p>Vous pouvez le définir comme attribut de classe lors de la déclaration du formulaire ou utiliser le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">renderer</span></code> de <code class=\"docutils literal notranslate\"><span class=\"pre\">Form.__init__()</span></code>. 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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">default_renderer</span> <span class=\"o\">=</span> <span class=\"n\">MyRenderer</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>ou :</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\">form</span> <span class=\"o\">=</span> <span class=\"n\">MyForm</span><span class=\"p\">(</span><span class=\"n\">renderer</span><span class=\"o\">=</span><span class=\"n\">MyRenderer</span><span class=\"p\">())</span>\n</code></pre></div>\n</section>\n<section id=\"notes-on-field-ordering\">\n<h3>Notes sur le tri des champs<a class=\"heading-anchor\" href=\"#notes-on-field-ordering\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Dans les raccourcis <code class=\"docutils literal notranslate\"><span class=\"pre\">as_p()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">as_ul()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">as_table()</span></code>, les champs sont affichés dans l’ordre de leur définition dans la classe de formulaire. Par exemple, dans l’exemple de <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code>, les champs sont définis dans l’ordre <code class=\"docutils literal notranslate\"><span class=\"pre\">subject</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">message</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">sender</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">cc_myself</span></code>. Pour changer cet ordre dans le résultat HTML, il suffit de changer l’ordre dans lequel ces champs apparaissent dans la classe.</p>\n<p>Il existe plusieurs autres manières de personnaliser cet ordre :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.field_order\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">field_order</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.field_order\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">Form.field_order=None</span></code>, ce qui conserve l’ordre dans lequel les champs sont définis dans la classe de formulaire. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">field_order</span></code> est une liste de noms de champs, les champs sont ordonnés en fonction de cette liste et les champs restants sont ajoutés selon l’ordre par défaut. Les noms de champs de la liste qui sont inconnus sont ignorés. Cela permet de désactiver un champ dans une sous-classe en le définissant à <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> sans avoir à redéfinir l’ordre.</p>\n<p>Il est également possible d’utiliser le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">Form.field_order</span></code> d’une classe <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> pour remplacer l’ordre des champs. Si un formulaire <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> définit <a class=\"reference internal\" href=\"#django.forms.Form.field_order\" title=\"django.forms.Form.field_order\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">field_order</span></code></a> <em>et</em> que <code class=\"docutils literal notranslate\"><span class=\"pre\">field_order</span></code> est inclus lors de l’instanciation de <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code>, c’est ce dernier <code class=\"docutils literal notranslate\"><span class=\"pre\">field_order</span></code> qui a la priorité.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.order_fields\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">order_fields</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_order</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.order_fields\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Vous pouvez réorganiser les champs à tout moment en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">order_fields()</span></code> avec une liste de noms de champs comme dans <a class=\"reference internal\" href=\"#django.forms.Form.field_order\" title=\"django.forms.Form.field_order\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">field_order</span></code></a>.</p>\n</section>\n<section id=\"how-errors-are-displayed\">\n<h3>Affichage des erreurs<a class=\"heading-anchor\" href=\"#how-errors-are-displayed\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lorsque vous affichez un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> lié à des données, le fait de l’afficher va automatiquement procéder à la validation du formulaire s’il ne l’a pas encore été, et le résultat HTML contiendra les erreurs de validation sous forme d’une section <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;ul</span> <span class=\"pre\">class=&quot;errorlist&quot;&gt;</span></code> à côté du champ. Le positionnement précis des messages d’erreur dépend de la méthode de rendu HTML utilisée :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;invalid email address&#39;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_table</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Subject:&lt;/th&gt;&lt;td&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;This field is required.&lt;/li&gt;&lt;/ul&gt;&lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Message:&lt;/th&gt;&lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;message&quot; value=&quot;Hi there&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Sender:&lt;/th&gt;&lt;td&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;Enter a valid email address.&lt;/li&gt;&lt;/ul&gt;&lt;input type=&quot;email&quot; name=&quot;sender&quot; value=&quot;invalid email address&quot; required /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"go\">&lt;tr&gt;&lt;th&gt;Cc myself:&lt;/th&gt;&lt;td&gt;&lt;input checked type=&quot;checkbox&quot; name=&quot;cc_myself&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;This field is required.&lt;/li&gt;&lt;/ul&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; value=&quot;Hi there&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;Enter a valid email address.&lt;/li&gt;&lt;/ul&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; value=&quot;invalid email address&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Cc myself: &lt;input checked type=&quot;checkbox&quot; name=&quot;cc_myself&quot; /&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_p</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;p&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;This field is required.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; value=&quot;Hi there&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;Enter a valid email address.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; value=&quot;invalid email address&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Cc myself: &lt;input checked type=&quot;checkbox&quot; name=&quot;cc_myself&quot; /&gt;&lt;/p&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"customizing-the-error-list-format\">\n<span id=\"ref-forms-error-list-format\"></span><h3>Personnalisation du format de la liste d’erreurs<a class=\"heading-anchor\" href=\"#customizing-the-error-list-format\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Par défaut, les formulaires utilisent <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms.utils.ErrorList</span></code> pour mettre en forme les erreurs de validation. Si vous aimeriez utiliser une autre classe pour afficher les erreurs, vous pouvez l’indiquer au moment de la construction du formulaire</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.forms.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ErrorList</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DivErrorList</span><span class=\"p\">(</span><span class=\"n\">ErrorList</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">as_divs</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span>    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">as_divs</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"bp\">self</span><span class=\"p\">:</span> <span class=\"k\">return</span> <span class=\"s1\">&#39;&#39;</span>\n<span class=\"gp\">... </span>        <span class=\"k\">return</span> <span class=\"s1\">&#39;&lt;div class=&quot;errorlist&quot;&gt;</span><span class=\"si\">%s</span><span class=\"s1\">&lt;/div&gt;&#39;</span> <span class=\"o\">%</span> <span class=\"s1\">&#39;&#39;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">([</span><span class=\"s1\">&#39;&lt;div class=&quot;error&quot;&gt;</span><span class=\"si\">%s</span><span class=\"s1\">&lt;/div&gt;&#39;</span> <span class=\"o\">%</span> <span class=\"n\">e</span> <span class=\"k\">for</span> <span class=\"n\">e</span> <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"n\">error_class</span><span class=\"o\">=</span><span class=\"n\">DivErrorList</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_p</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;div class=&quot;errorlist&quot;&gt;&lt;div class=&quot;error&quot;&gt;This field is required.&lt;/div&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;p&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; value=&quot;Hi there&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;div class=&quot;errorlist&quot;&gt;&lt;div class=&quot;error&quot;&gt;Enter a valid email address.&lt;/div&gt;&lt;/div&gt;</span>\n<span class=\"go\">&lt;p&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; value=&quot;invalid email address&quot; required /&gt;&lt;/p&gt;</span>\n<span class=\"go\">&lt;p&gt;Cc myself: &lt;input checked type=&quot;checkbox&quot; name=&quot;cc_myself&quot; /&gt;&lt;/p&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"more-granular-output\">\n<h2>Un affichage plus fin<a class=\"heading-anchor\" href=\"#more-granular-output\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les méthodes <code class=\"docutils literal notranslate\"><span class=\"pre\">as_p()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">as_ul()</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">as_table()</span></code> ne sont que des raccourcis, ce ne sont pas les seules façons d’afficher une objet formulaire.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField\">\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\">BoundField</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Utilisé pour afficher en HTML un champ unique d’une instance de <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> ou pour accéder à ses attributs.</p>\n<p>La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> de cet objet affiche le code HTML du champ.</p>\n</dd></dl>\n\n<p>Pour récupérer un seul <code class=\"docutils literal notranslate\"><span class=\"pre\">BoundField</span></code>, employez la syntaxe de consultation de dictionnaire sur le formulaire en utilisant le nom du champ comme clé :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;</span>\n</code></pre></div>\n<p>Pour obtenir tous les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">BoundField</span></code>, faites une boucle sur le formulaire :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">boundfield</span> <span class=\"ow\">in</span> <span class=\"n\">form</span><span class=\"p\">:</span> <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">boundfield</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;input id=&quot;id_subject&quot; type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;</span>\n<span class=\"go\">&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;</span>\n<span class=\"go\">&lt;input type=&quot;email&quot; name=&quot;sender&quot; id=&quot;id_sender&quot; required /&gt;</span>\n<span class=\"go\">&lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; id=&quot;id_cc_myself&quot; /&gt;</span>\n</code></pre></div>\n<p>Le résultat HTML spécifique de chaque champ respecte le réglage <code class=\"docutils literal notranslate\"><span class=\"pre\">auto_id</span></code> de l’objet formulaire :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;input type=&quot;text&quot; name=&quot;message&quot; required /&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"s1\">&#39;id_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;input type=&quot;text&quot; name=&quot;message&quot; id=&quot;id_message&quot; required /&gt;</span>\n</code></pre></div>\n<section id=\"attributes-of-boundfield\">\n<h3>Attributs de <code class=\"docutils literal notranslate\"><span class=\"pre\">BoundField</span></code><a class=\"heading-anchor\" href=\"#attributes-of-boundfield\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.auto_id\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">auto_id</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.auto_id\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>L’attribut HTML ID de cet objet <code class=\"docutils literal notranslate\"><span class=\"pre\">BoundField</span></code>. Renvoie une chaîne vide si <a class=\"reference internal\" href=\"#django.forms.Form.auto_id\" title=\"django.forms.Form.auto_id\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Form.auto_id</span></code></a> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.data\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">data</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.data\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cette propriété renvoie les données de cet objet <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BoundField</span></code></a> extraites par la méthode de composant <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/widgets/#django.forms.Widget.value_from_datadict\" title=\"django.forms.Widget.value_from_datadict\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">value_from_datadict()</span></code></a>, ou <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> si elle n’a pas été indiquée :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">unbound_form</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">unbound_form</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">bound_form</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;My Subject&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">bound_form</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"p\">)</span>\n<span class=\"go\">My Subject</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.errors\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">errors</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.errors\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un <a class=\"reference internal\" href=\"#ref-forms-error-list-format\"><span class=\"std std-ref\">objet apparenté à une liste</span></a> qui s’affiche par une section <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;ul</span> <span class=\"pre\">class=&quot;errorlist&quot;&gt;</span></code> lorsqu’il est affiché en HTML :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hi&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">&lt;input type=&quot;text&quot; name=&quot;message&quot; required /&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">[&#39;This field is required.&#39;]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;ul class=&quot;errorlist&quot;&gt;&lt;li&gt;This field is required.&lt;/li&gt;&lt;/ul&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">errors</span>\n<span class=\"go\">[]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">str</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">errors</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;&#39;</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.field\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">field</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.field\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>L’instance <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> de la classe de formulaire que cet objet <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BoundField</span></code></a> adapte.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.form\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">form</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.form\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>L’instance <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> à laquelle est lié cet objet <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BoundField</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.help_text\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">help_text</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.help_text\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le texte d’aide <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field.help_text\" title=\"django.forms.Field.help_text\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">help_text</span></code></a> du champ.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.html_name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">html_name</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.html_name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom qui sera utilisé dans l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> du code HTML du composant. Il prend en compte la valeur <a class=\"reference internal\" href=\"#django.forms.Form.prefix\" title=\"django.forms.Form.prefix\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">prefix</span></code></a> du formulaire.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.id_for_label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">id_for_label</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.id_for_label\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Utilisez cette propriété pour produire l’identifiant de ce champ. Par exemple, si vous construisez manuellement une balise <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code> dans un gabarit (sans tenir compte que <a class=\"reference internal\" href=\"#django.forms.BoundField.label_tag\" title=\"django.forms.BoundField.label_tag\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">label_tag()</span></code></a> le ferait très bien à votre place) :</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.my_field.id_for_label</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>...<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">my_field</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>Par défaut, il s’agira du nom du champ préfixé par <code class=\"docutils literal notranslate\"><span class=\"pre\">id_</span></code> ( »<code class=\"docutils literal notranslate\"><span class=\"pre\">id_my_field</span></code> » dans l’exemple ci-dessus). Il est possible de modifier cet identifiant en renseignant <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/widgets/#django.forms.Widget.attrs\" title=\"django.forms.Widget.attrs\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">attrs</span></code></a> pour le composant du champ. Par exemple, en définissant un champ 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\">my_field</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">TextInput</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;id&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;myFIELD&#39;</span><span class=\"p\">}))</span>\n</code></pre></div>\n<p>et en utilisant le gabarit ci-dessus, le résultat affiché donnera quelque chose comme :</p>\n<div class=\"code-block\" data-language=\"html\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Html</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Html code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;myFIELD&quot;</span><span class=\"p\">&gt;</span>...<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">input</span> <span class=\"na\">id</span><span class=\"o\">=</span><span class=\"s\">&quot;myFIELD&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;text&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;my_field&quot;</span> <span class=\"na\">required</span> <span class=\"p\">/&gt;</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.is_hidden\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">is_hidden</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.is_hidden\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> si le composant de cet objet <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BoundField</span></code></a> est invisible.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.label\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.label\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>L’étiquette <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field.label\" title=\"django.forms.Field.label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">label</span></code></a> du champ. Utilisée dans la méthode <a class=\"reference internal\" href=\"#django.forms.BoundField.label_tag\" title=\"django.forms.BoundField.label_tag\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">label_tag()</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le nom de ce champ dans le formulaire :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n<span class=\"go\">subject</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n<span class=\"go\">message</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"methods-of-boundfield\">\n<h3>Méthodes de <code class=\"docutils literal notranslate\"><span class=\"pre\">BoundField</span></code><a class=\"heading-anchor\" href=\"#methods-of-boundfield\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.as_hidden\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_hidden</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">attrs</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=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.as_hidden\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie une chaîne HTML pour représenter le champ sous forme de <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input</span> <span class=\"pre\">type=&quot;hidden&quot;&gt;</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code> est retransmis à <a class=\"reference internal\" href=\"#django.forms.BoundField.as_widget\" title=\"django.forms.BoundField.as_widget\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">as_widget()</span></code></a>.</p>\n<p>Cette méthode est essentiellement utilisée en interne. Il est préférable d’utiliser plutôt un composant (<code class=\"docutils literal notranslate\"><span class=\"pre\">widget</span></code>).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.as_widget\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">as_widget</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">widget</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\">attrs</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\">only_initial</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.as_widget\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Produit l’affichage du champ en s’appuyant sur le composant <code class=\"docutils literal notranslate\"><span class=\"pre\">widget</span></code> transmis, et en ajoutant d’éventuels attributs HTML transmis dans <code class=\"docutils literal notranslate\"><span class=\"pre\">attrs</span></code>. Si aucun composant n’est fourni, c’est le composant par défaut du champ qui sera utilisé.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">only_initial</span></code> est utilisé en interne par Django et ne devrait pas être défini explicitement.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.css_classes\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">css_classes</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.css_classes\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Lorsque vous utilisez les raccourcis d’affichage de Django, les classes CSS sont utilisées pour indiquer les champs de formulaire obligatoires ou les champs contenant des erreurs. Si vous affichez manuellement les champs de formulaire, ces classes CSS sont disponibles par la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">css_classes</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">css_classes</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;required&#39;</span>\n</code></pre></div>\n<p>Si vous souhaitez fournir des classes supplémentaires en plus des classes liées aux erreurs et aux champs obligatoires, il est possible d’indiquer ces classes en paramètre :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">css_classes</span><span class=\"p\">(</span><span class=\"s1\">&#39;foo bar&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;foo bar required&#39;</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.label_tag\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">label_tag</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">contents</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\">attrs</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\">label_suffix</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.forms.BoundField.label_tag\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Pour afficher séparément la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code> d’un champ de formulaire, on peut appeler sa méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">label_tag()</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">[</span><span class=\"s1\">&#39;message&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">label_tag</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;label for=&quot;id_message&quot;&gt;Message:&lt;/label&gt;</span>\n</code></pre></div>\n<p>Il est possible de fournir le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">contents</span></code> qui remplacera la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">label</span></code> générée automatiquement. Un dictionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">attrs</span></code> peut contenir des attributs supplémentaires de la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;label&gt;</span></code>.</p>\n<p>Le code HTML produit inclut la valeur <a class=\"reference internal\" href=\"#django.forms.Form.label_suffix\" title=\"django.forms.Form.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">label_suffix</span></code></a> du formulaire (un caractère deux-points par défaut) ou, s’il est défini, la valeur <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field.label_suffix\" title=\"django.forms.Field.label_suffix\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">label_suffix</span></code></a> du champ spécifique. Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">label_suffix</span></code> facultatif permet de surcharger tout suffixe défini précédemment. Par exemple, vous pouvez utiliser une chaîne vide pour masquer l’étiquette pour certains champs précis. Si vous avez besoin de le faire dans un gabarit, il est possible d’écrire un filtre personnalisé afin de pouvoir passer des paramètres à <code class=\"docutils literal notranslate\"><span class=\"pre\">label_tag</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.BoundField.value\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">BoundField.</span></span><span class=\"sig-name descname\"><span class=\"pre\">value</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.BoundField.value\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Utilisez cette méthode pour afficher la valeur brute d’un champ telle qu’elle serait contenue dans un composant <code class=\"docutils literal notranslate\"><span class=\"pre\">Widget</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">initial</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;welcome&#39;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">unbound_form</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"n\">initial</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">bound_form</span> <span class=\"o\">=</span> <span class=\"n\">ContactForm</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hi&#39;</span><span class=\"p\">},</span> <span class=\"n\">initial</span><span class=\"o\">=</span><span class=\"n\">initial</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">unbound_form</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">())</span>\n<span class=\"go\">welcome</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">bound_form</span><span class=\"p\">[</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">())</span>\n<span class=\"go\">hi</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"customizing-boundfield\">\n<h2>Personnalisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">BoundField</span></code><a class=\"heading-anchor\" href=\"#customizing-boundfield\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Si vous avez besoin d’accéder à certaines informations supplémentaires d’un champ de formulaire dans un gabarit et que l’utilisation d’une sous-classe de <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> ne suffit pas, envisagez également la personnalisation de <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BoundField</span></code></a>.</p>\n<p>Un champ de formulaire personnalisé peut remplacer <code class=\"docutils literal notranslate\"><span class=\"pre\">get_bound_field()</span></code>:</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Field.get_bound_field\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Field.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_bound_field</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">form</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Field.get_bound_field\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Accepte une instance de <a class=\"reference internal\" href=\"#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> et le nom du champ. La valeur renvoyée sera utilisée pour accéder au champ dans un gabarit. Il s’agira très probablement d’une instance d’une sous-classe de <a class=\"reference internal\" href=\"#django.forms.BoundField\" title=\"django.forms.BoundField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BoundField</span></code></a>.</p>\n</dd></dl>\n\n<p>Si par exemple vous avez un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">GPSCoordinatesField</span></code> et que vous souhaitez pouvoir accéder à des informations supplémentaires sur les coordonnées dans un gabarit, cela pourrait être implémenté de cette façon :</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">GPSCoordinatesBoundField</span><span class=\"p\">(</span><span class=\"n\">BoundField</span><span class=\"p\">):</span>\n    <span class=\"nd\">@property</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">country</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Return the country the coordinates lie in or None if it can&#39;t be</span>\n<span class=\"sd\">        determined.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"n\">value</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">value</span><span class=\"p\">()</span>\n        <span class=\"k\">if</span> <span class=\"n\">value</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">get_country_from_coordinates</span><span class=\"p\">(</span><span class=\"n\">value</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">GPSCoordinatesField</span><span class=\"p\">(</span><span class=\"n\">Field</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_bound_field</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"p\">,</span> <span class=\"n\">field_name</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">GPSCoordinatesBoundField</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">field_name</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Il est maintenant possible d’accéder au pays dans un gabarit avec <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">form.coordinates.country</span> <span class=\"pre\">}}</span></code>.</p>\n</section>\n<section id=\"binding-uploaded-files-to-a-form\">\n<span id=\"binding-uploaded-files\"></span><h2>Liaison de fichiers téléversés avec un formulaire<a class=\"heading-anchor\" href=\"#binding-uploaded-files-to-a-form\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsqu’on a affaire à des champs de formulaire de type <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">ImageField</span></code>, les choses se compliquent un peu plus.</p>\n<p>Premièrement, pour pouvoir envoyer des fichiers, il est important que la balise <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;form&gt;</span></code> du formulaire définisse correctement son attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">enctype</span></code> à <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;multipart/form-data&quot;</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=\"o\">&lt;</span><span class=\"n\">form</span> <span class=\"n\">enctype</span><span class=\"o\">=</span><span class=\"s2\">&quot;multipart/form-data&quot;</span> <span class=\"n\">method</span><span class=\"o\">=</span><span class=\"s2\">&quot;post&quot;</span> <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s2\">&quot;/foo/&quot;</span><span class=\"o\">&gt;</span>\n</code></pre></div>\n<p>Deuxièmement, au moment d’instancier le formulaire, il faut lier les données de type fichier. Ces données sont traitées de manière distincte des données habituelles de formulaire, ce qui fait que quand un formulaire contient un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">ImageField</span></code>, il doit recevoir un second paramètre au moment de faire la liaison entre le formulaire et les données. Ainsi, si nous étendons notre <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code> pour qu’il contienne un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">ImageField</span></code> nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">mugshot</span></code>, nous devons lier les données de fichier contenant l’image <code class=\"docutils literal notranslate\"><span class=\"pre\">mugshot</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=\"c1\"># Bound form with an image field</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.files.uploadedfile</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleUploadedFile</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;subject&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;hello&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>         <span class=\"s1\">&#39;message&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Hi there&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>         <span class=\"s1\">&#39;sender&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;foo@example.com&#39;</span><span class=\"p\">,</span>\n<span class=\"o\">...</span>         <span class=\"s1\">&#39;cc_myself&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">file_data</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;mugshot&#39;</span><span class=\"p\">:</span> <span class=\"n\">SimpleUploadedFile</span><span class=\"p\">(</span><span class=\"s1\">&#39;face.jpg&#39;</span><span class=\"p\">,</span> <span class=\"o\">&lt;</span><span class=\"n\">file</span> <span class=\"n\">data</span><span class=\"o\">&gt;</span><span class=\"p\">)}</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactFormWithMugshot</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span> <span class=\"n\">file_data</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>En pratique, vous allez généralement indiquer <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> comme source des données de fichier (comme pour <code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST</span></code> représentant la source des données de formulaire) :</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=\"c1\"># Bound form with an image field, data from the request</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactFormWithMugshot</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>La construction d’un formulaire non lié ne change pas, il suffit d’omettre aussi bien les données de formulaire que les données de fichier :</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=\"c1\"># Unbound form with an image field</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactFormWithMugshot</span><span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"testing-for-multipart-forms\">\n<h3>Détection des formulaires composites<a class=\"heading-anchor\" href=\"#testing-for-multipart-forms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.is_multipart\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">is_multipart</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Form.is_multipart\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Si vous écrivez des vues ou des gabarits réutilisables, il peut arriver que l’on ne sache pas à l’avance si un formulaire est composite. La méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">is_multipart()</span></code> indique si le formulaire nécessite un codage composite lors de son envoi :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactFormWithMugshot</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">is_multipart</span><span class=\"p\">()</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>Voici un exemple de la façon d’utiliser cette méthode dans un gabarit :</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><span class=\"o\">%</span> <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_multipart</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n    <span class=\"o\">&lt;</span><span class=\"n\">form</span> <span class=\"n\">enctype</span><span class=\"o\">=</span><span class=\"s2\">&quot;multipart/form-data&quot;</span> <span class=\"n\">method</span><span class=\"o\">=</span><span class=\"s2\">&quot;post&quot;</span> <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s2\">&quot;/foo/&quot;</span><span class=\"o\">&gt;</span>\n<span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">else</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n    <span class=\"o\">&lt;</span><span class=\"n\">form</span> <span class=\"n\">method</span><span class=\"o\">=</span><span class=\"s2\">&quot;post&quot;</span> <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s2\">&quot;/foo/&quot;</span><span class=\"o\">&gt;</span>\n<span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"n\">endif</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n<span class=\"p\">{{</span> <span class=\"n\">form</span> <span class=\"p\">}}</span>\n<span class=\"o\">&lt;/</span><span class=\"n\">form</span><span class=\"o\">&gt;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"subclassing-forms\">\n<h2>Formulaires et sous-classes<a class=\"heading-anchor\" href=\"#subclassing-forms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Si vous avez plusieurs classes <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> dont les champs sont partagés, il est possible d’utiliser l’héritage pour éviter la redondance.</p>\n<p>Lorsque vous héritez d’une classe <code class=\"docutils literal notranslate\"><span class=\"pre\">Form</span></code> personnalisée, la sous-classe résultante inclut tous les champs des ses classes parentes, suivis des champs définis dans la sous-classe.</p>\n<p>Dans cet exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactFormWithPriority</span></code> contient tous les champs de <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code> plus un champ supplémentaire, <code class=\"docutils literal notranslate\"><span class=\"pre\">priority</span></code>. Les champs de <code class=\"docutils literal notranslate\"><span class=\"pre\">ContactForm</span></code> apparaissent en premier :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ContactFormWithPriority</span><span class=\"p\">(</span><span class=\"n\">ContactForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">priority</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">ContactFormWithPriority</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;Subject: &lt;input type=&quot;text&quot; name=&quot;subject&quot; maxlength=&quot;100&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Message: &lt;input type=&quot;text&quot; name=&quot;message&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Sender: &lt;input type=&quot;email&quot; name=&quot;sender&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Cc myself: &lt;input type=&quot;checkbox&quot; name=&quot;cc_myself&quot; /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Priority: &lt;input type=&quot;text&quot; name=&quot;priority&quot; required /&gt;&lt;/li&gt;</span>\n</code></pre></div>\n<p>Il est possible d’hériter de plusieurs formulaires, en considérant ces formulaires comme des « mixins ». Dans cet exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">BeatleForm</span></code> hérite à la fois de <code class=\"docutils literal notranslate\"><span class=\"pre\">PersonForm</span></code> et de <code class=\"docutils literal notranslate\"><span class=\"pre\">InstrumentForm</span></code> (dans cet ordre), et sa liste de champs contient les champs de ses classes parentes :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span>    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">InstrumentForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">instrument</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BeatleForm</span><span class=\"p\">(</span><span class=\"n\">InstrumentForm</span><span class=\"p\">,</span> <span class=\"n\">PersonForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">haircut_type</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"n\">BeatleForm</span><span class=\"p\">(</span><span class=\"n\">auto_id</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;First name: &lt;input type=&quot;text&quot; name=&quot;first_name&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Last name: &lt;input type=&quot;text&quot; name=&quot;last_name&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Instrument: &lt;input type=&quot;text&quot; name=&quot;instrument&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;Haircut type: &lt;input type=&quot;text&quot; name=&quot;haircut_type&quot; required /&gt;&lt;/li&gt;</span>\n</code></pre></div>\n<p>Il est possible d’enlever de manière déclarative un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">Field</span></code> hérité d’une classe parente en définissant son nom à <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> dans la sous-classe. 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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ParentForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">()</span>\n<span class=\"gp\">... </span>    <span class=\"n\">age</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildForm</span><span class=\"p\">(</span><span class=\"n\">ParentForm</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"kc\">None</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">list</span><span class=\"p\">(</span><span class=\"n\">ChildForm</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">fields</span><span class=\"p\">)</span>\n<span class=\"go\">[&#39;age&#39;]</span>\n</code></pre></div>\n</section>\n<section id=\"prefixes-for-forms\">\n<span id=\"form-prefix\"></span><h2>Préfixes de formulaires<a class=\"heading-anchor\" href=\"#prefixes-for-forms\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Form.prefix\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Form.</span></span><span class=\"sig-name descname\"><span class=\"pre\">prefix</span></span><a class=\"heading-anchor\" href=\"#django.forms.Form.prefix\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Une balise <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;form&gt;</span></code> peut contenir plusieurs formulaires Django. Afin que chaque formulaire possède son propre espace de noms, utilisez le paramètre nommé <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">mother</span> <span class=\"o\">=</span> <span class=\"n\">PersonForm</span><span class=\"p\">(</span><span class=\"n\">prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;mother&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">father</span> <span class=\"o\">=</span> <span class=\"n\">PersonForm</span><span class=\"p\">(</span><span class=\"n\">prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;father&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">mother</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_mother-first_name&quot;&gt;First name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;mother-first_name&quot; id=&quot;id_mother-first_name&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_mother-last_name&quot;&gt;Last name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;mother-last_name&quot; id=&quot;id_mother-last_name&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">father</span><span class=\"o\">.</span><span class=\"n\">as_ul</span><span class=\"p\">())</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_father-first_name&quot;&gt;First name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;father-first_name&quot; id=&quot;id_father-first_name&quot; required /&gt;&lt;/li&gt;</span>\n<span class=\"go\">&lt;li&gt;&lt;label for=&quot;id_father-last_name&quot;&gt;Last name:&lt;/label&gt; &lt;input type=&quot;text&quot; name=&quot;father-last_name&quot; id=&quot;id_father-last_name&quot; required /&gt;&lt;/li&gt;</span>\n</code></pre></div>\n<p>Le préfixe peut aussi être défini au niveau de la classe de formulaire :</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=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PersonForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"o\">...</span>\n<span class=\"gp\">... </span>    <span class=\"n\">prefix</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;person&#39;</span>\n</code></pre></div>\n</section>","rootId":"module-django.forms","toc":[{"title":"Formulaires liés et non liés","anchor":"bound-and-unbound-forms","children":[]},{"title":"Utilisation de formulaires pour valider des données","anchor":"using-forms-to-validate-data","children":[{"title":"Comportement des formulaires non liés","anchor":"behavior-of-unbound-forms","children":[]}]},{"title":"Valeurs initiales dynamiques","anchor":"dynamic-initial-values","children":[]},{"title":"Contrôle des données de formulaires modifiées","anchor":"checking-which-form-data-has-changed","children":[]},{"title":"Accès aux champs depuis le formulaire","anchor":"accessing-the-fields-from-the-form","children":[]},{"title":"Accès aux données « nettoyées »","anchor":"accessing-clean-data","children":[]},{"title":"Affichage des formulaires en HTML","anchor":"outputting-forms-as-html","children":[{"title":"as_p()","anchor":"as-p","children":[]},{"title":"as_ul()","anchor":"as-ul","children":[]},{"title":"as_table()","anchor":"as-table","children":[]},{"title":"Ajout de styles aux lignes de formulaire obligatoires ou erronées","anchor":"styling-required-or-erroneous-form-rows","children":[]},{"title":"Configuration des attributs id et des balises <label> dans le code HTML des formulaires","anchor":"configuring-form-elements-html-id-attributes-and-label-tags","children":[]},{"title":"Configuration du rendu des composants de formulaires","anchor":"configuring-the-rendering-of-a-form-s-widgets","children":[]},{"title":"Notes sur le tri des champs","anchor":"notes-on-field-ordering","children":[]},{"title":"Affichage des erreurs","anchor":"how-errors-are-displayed","children":[]},{"title":"Personnalisation du format de la liste d’erreurs","anchor":"customizing-the-error-list-format","children":[]}]},{"title":"Un affichage plus fin","anchor":"more-granular-output","children":[{"title":"Attributs de BoundField","anchor":"attributes-of-boundfield","children":[]},{"title":"Méthodes de BoundField","anchor":"methods-of-boundfield","children":[]}]},{"title":"Personnalisation de BoundField","anchor":"customizing-boundfield","children":[]},{"title":"Liaison de fichiers téléversés avec un formulaire","anchor":"binding-uploaded-files-to-a-form","children":[{"title":"Détection des formulaires composites","anchor":"testing-for-multipart-forms","children":[]}]},{"title":"Formulaires et sous-classes","anchor":"subclassing-forms","children":[]},{"title":"Préfixes de formulaires","anchor":"prefixes-for-forms","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/2.0/ref/"},{"docname":"ref/forms/index","title":"Formulaires","url":"/fr/2.0/ref/forms/"}],"prev":{"docname":"ref/forms/index","title":"Formulaires","url":"/fr/2.0/ref/forms/"},"next":{"docname":"ref/forms/fields","title":"Champs de formulaires","url":"/fr/2.0/ref/forms/fields/"},"formats":{"html":"/fr/2.0/ref/forms/api/","markdown":"/fr/2.0/ref/forms/api.md","json":"/fr/2.0/ref/forms/api.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/ref/forms/api.txt","official":"https://docs.djangoproject.com/fr/2.0/ref/forms/api/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}