{"title":"Composants de formulaires (« widgets »)","version":"1.9","locale":"fr","docname":"ref/forms/widgets","url":"/fr/1.9/ref/forms/widgets/","canonical":"https://djangodocs.dev/fr/1.9/ref/forms/widgets/","summary":"Un composant de formulaire est la représentation Django d’un élément de saisie HTML.","html":"<span id=\"widgets\"></span><h1>Composants de formulaires (« widgets »)<a class=\"heading-anchor\" href=\"#module-django.forms.widgets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Un composant de formulaire est la représentation Django d’un élément de saisie HTML. Le composant se charge de produire le code HTML et d’extraire les données qui lui sont propres dans un dictionnaire GET/POST.</p>\n<aside class=\"admonition admonition-tip\" role=\"note\">\n<p class=\"admonition-title\">Astuce</p>\n<p>Il ne faut pas confondre les composants avec les <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/\"><span class=\"doc\">champs de formulaires</span></a>. Ces derniers se chargent de la logique de validation de la saisie et sont directement utilisés dans les gabarits. Les composants de formulaires s’occupent de produire le code HTML des éléments de saisie de formulaire dans les pages Web ainsi que de l’extraction de données brutes envoyées. Cependant, les composants de formulaires doivent être <a class=\"reference internal\" href=\"#widget-to-field\"><span class=\"std std-ref\">attribués</span></a> aux champs de formulaires.</p>\n</aside>\n<section id=\"specifying-widgets\">\n<span id=\"widget-to-field\"></span><h2>Définition des composants<a class=\"heading-anchor\" href=\"#specifying-widgets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Chaque fois que vous définissez un champ de formulaire, Django utilise un composant par défaut correspondant au type de donnée qui doit être affiché. Pour savoir quel composant est utilisé pour quel champ, consultez la documentation au sujet des <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#built-in-fields\"><span class=\"std std-ref\">champs intégrés</span></a>.</p>\n<p>Cependant, si vous souhaitez utiliser un autre composant pour un champ, il suffit d’utiliser le paramètre <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.Field.widget\" title=\"django.forms.Field.widget\"><code class=\"xref py py-attr docutils literal notranslate\">widget</code></a> dans la définition du champ. 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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">CommentForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n    url <span class=\"o\">=</span> forms<span class=\"o\">.</span>URLField<span class=\"p\">()</span>\n    comment <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>Textarea<span class=\"p\">)</span>\n</code></pre></div>\n<p>Ce code définit un formulaire avec un champ de commentaires utilisant un composant <a class=\"reference internal\" href=\"#django.forms.Textarea\" title=\"django.forms.Textarea\"><code class=\"xref py py-class docutils literal notranslate\">Textarea</code></a> plus grand, plutôt que le composant <a class=\"reference internal\" href=\"#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a> par défaut.</p>\n</section>\n<section id=\"setting-arguments-for-widgets\">\n<h2>Définition de paramètres pour les composants<a class=\"heading-anchor\" href=\"#setting-arguments-for-widgets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Beaucoup de composants acceptent des paramètres supplémentaires facultatifs ; ils peuvent être définis lors de l’attribution du composant au champ de formulaire. Dans l’exemple suivant, l’attribut <a class=\"reference internal\" href=\"#django.forms.SelectDateWidget.years\" title=\"django.forms.SelectDateWidget.years\"><code class=\"xref py py-attr docutils literal notranslate\">years</code></a> est défini pour un composant <a class=\"reference internal\" href=\"#django.forms.SelectDateWidget\" title=\"django.forms.SelectDateWidget\"><code class=\"xref py py-class docutils literal notranslate\">SelectDateWidget</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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\nBIRTH_YEAR_CHOICES <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;1980&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;1981&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;1982&#39;</span><span class=\"p\">)</span>\nFAVORITE_COLORS_CHOICES <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;blue&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Blue&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;green&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Green&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;black&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Black&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">SimpleForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    birth_year <span class=\"o\">=</span> forms<span class=\"o\">.</span>DateField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>SelectDateWidget<span class=\"p\">(</span>years<span class=\"o\">=</span>BIRTH_YEAR_CHOICES<span class=\"p\">))</span>\n    favorite_colors <span class=\"o\">=</span> forms<span class=\"o\">.</span>MultipleChoiceField<span class=\"p\">(</span>\n        required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n        widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>CheckboxSelectMultiple<span class=\"p\">,</span>\n        choices<span class=\"o\">=</span>FAVORITE_COLORS_CHOICES<span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>Consultez les <a class=\"reference internal\" href=\"#built-in-widgets\"><span class=\"std std-ref\">composants de formulaires intégrés</span></a> pour plus d’informations sur les composants disponibles et les paramètres acceptés.</p>\n</section>\n<section id=\"widgets-inheriting-from-the-select-widget\">\n<h2>Composants héritant du composant <code class=\"docutils literal notranslate\">Select</code><a class=\"heading-anchor\" href=\"#widgets-inheriting-from-the-select-widget\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les composants héritant du composant <a class=\"reference internal\" href=\"#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a> gèrent des choix. Ils offrent à l’utilisateur une liste d’options à choix. Les différents composants présentent ces choix différemment ; le composant <a class=\"reference internal\" href=\"#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a> utilise lui-même une représentation en liste HTML <code class=\"docutils literal notranslate\">&lt;select&gt;</code>, alors que <a class=\"reference internal\" href=\"#django.forms.RadioSelect\" title=\"django.forms.RadioSelect\"><code class=\"xref py py-class docutils literal notranslate\">RadioSelect</code></a> utilise des boutons radio.</p>\n<p>Les composants <a class=\"reference internal\" href=\"#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a> sont utilisés par défaut pour les champs <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.ChoiceField\" title=\"django.forms.ChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ChoiceField</code></a>. Les choix affichés dans le composant sont hérités de <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.ChoiceField\" title=\"django.forms.ChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ChoiceField</code></a>, ce qui fait qu’en modifiant <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.ChoiceField.choices\" title=\"django.forms.ChoiceField.choices\"><code class=\"xref py py-attr docutils literal notranslate\">ChoiceField.choices</code></a>, les choix disponibles dans <a class=\"reference internal\" href=\"#django.forms.Select.choices\" title=\"django.forms.Select.choices\"><code class=\"xref py py-attr docutils literal notranslate\">Select.choices</code></a> sont mis à jour. 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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"gp\">&gt;&gt;&gt; </span>CHOICES <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"s1\">&#39;1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;First&#39;</span><span class=\"p\">,),</span> <span class=\"p\">(</span><span class=\"s1\">&#39;2&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Second&#39;</span><span class=\"p\">,))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>choice_field <span class=\"o\">=</span> forms<span class=\"o\">.</span>ChoiceField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>RadioSelect<span class=\"p\">,</span> choices<span class=\"o\">=</span>CHOICES<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>choice_field<span class=\"o\">.</span>choices\n<span class=\"go\">[(&#39;1&#39;, &#39;First&#39;), (&#39;2&#39;, &#39;Second&#39;)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>choice_field<span class=\"o\">.</span>widget<span class=\"o\">.</span>choices\n<span class=\"go\">[(&#39;1&#39;, &#39;First&#39;), (&#39;2&#39;, &#39;Second&#39;)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>choice_field<span class=\"o\">.</span>widget<span class=\"o\">.</span>choices <span class=\"o\">=</span> <span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>choice_field<span class=\"o\">.</span>choices <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"s1\">&#39;1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;First and only&#39;</span><span class=\"p\">,),)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>choice_field<span class=\"o\">.</span>widget<span class=\"o\">.</span>choices\n<span class=\"go\">[(&#39;1&#39;, &#39;First and only&#39;)]</span>\n</code></pre></div>\n<p>Les composants possédant un attribut <a class=\"reference internal\" href=\"#django.forms.Select.choices\" title=\"django.forms.Select.choices\"><code class=\"xref py py-attr docutils literal notranslate\">choices</code></a> peuvent toutefois être utilisés avec des champs qui ne sont pas basés sur des choix, comme par exemple <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.CharField\" title=\"django.forms.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>, mais il est recommandé d’utiliser plutôt un champ basé sur <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.ChoiceField\" title=\"django.forms.ChoiceField\"><code class=\"xref py py-class docutils literal notranslate\">ChoiceField</code></a> lorsque les choix sont inhérents au modèle et pas simplement une manière d’afficher un composant.</p>\n</section>\n<section id=\"customizing-widget-instances\">\n<h2>Personnalisation des instances de composants<a class=\"heading-anchor\" href=\"#customizing-widget-instances\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsque Django affiche un composant en HTML, le balisage est minimal - Django n’ajoute ni nom de classe, ni d’autres attributs spécifiques au composant. Cela signifie que par exemple tous les composants <a class=\"reference internal\" href=\"#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a> ont la même apparence sur les pages Web.</p>\n<p>Il y a deux manières de personnaliser des composants : <a class=\"reference internal\" href=\"#styling-widget-instances\"><span class=\"std std-ref\">par instance de composant</span></a> et <a class=\"reference internal\" href=\"#styling-widget-classes\"><span class=\"std std-ref\">par classe de composant</span></a>.</p>\n<section id=\"styling-widget-instances\">\n<span id=\"id1\"></span><h3>Ajout de styles aux instances de composants<a class=\"heading-anchor\" href=\"#styling-widget-instances\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous souhaitez qu’une instance de composant apparaisse différemment d’une autre instance, il sera nécessaire d’indiquer des attributs supplémentaires au moment où l’objet composant est instancié et qu’il est attribué à un champ de formulaire (ce qui n’empêche pas d’ajouter aussi certaines règles dans vos fichiers CSS).</p>\n<p>Par exemple, en prenant l’exemple de ce formulaire simple :</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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">CommentForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n    url <span class=\"o\">=</span> forms<span class=\"o\">.</span>URLField<span class=\"p\">()</span>\n    comment <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n</code></pre></div>\n<p>Ce formulaire inclut trois composants <a class=\"reference internal\" href=\"#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a> par défaut, avec le rendu HTML par défaut – pas de classe CSS, pas d’attribut supplémentaire. Cela signifie que les zones de saisie présentées par chaque composant seront affichées exactement de la même manière :</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>f <span class=\"o\">=</span> CommentForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>as_table<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; /&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;/&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; /&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<p>Sur une page Web réelle, il est souvent souhaitable d’afficher les composants de manière différente. Le champ commentaire pourrait nécessiter une plus grande zone de saisie, et le composant « name » pourrait être complété par une classe CSS spécifique. Il est aussi possible de définir l’attribut « type » pour profiter des nouveaux types de composants HTML5. Pour cela, utilisez le paramètre <a class=\"reference internal\" href=\"#django.forms.Widget.attrs\" title=\"django.forms.Widget.attrs\"><code class=\"xref py py-attr docutils literal notranslate\">Widget.attrs</code></a> lors de la création du composant :</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=\"nc\">CommentForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>TextInput<span class=\"p\">(</span>attrs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;class&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;special&#39;</span><span class=\"p\">}))</span>\n    url <span class=\"o\">=</span> forms<span class=\"o\">.</span>URLField<span class=\"p\">()</span>\n    comment <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>TextInput<span class=\"p\">(</span>attrs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;size&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;40&#39;</span><span class=\"p\">}))</span>\n</code></pre></div>\n<p>Django se chargera ensuite d’inclure les attributs supplémentaires dans le résultat affiché :</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>f <span class=\"o\">=</span> CommentForm<span class=\"p\">(</span>auto_id<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>f<span class=\"o\">.</span>as_table<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; class=&quot;special&quot;/&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;/&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; size=&quot;40&quot;/&gt;&lt;/td&gt;&lt;/tr&gt;</span>\n</code></pre></div>\n<p>Vous pouvez également définir l’attribut HTML <code class=\"docutils literal notranslate\">id</code> à l’aide de <a class=\"reference internal\" href=\"#django.forms.Widget.attrs\" title=\"django.forms.Widget.attrs\"><code class=\"xref py py-attr docutils literal notranslate\">attrs</code></a>. Voir <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/api/#django.forms.BoundField.id_for_label\" title=\"django.forms.BoundField.id_for_label\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.id_for_label</code></a> pour un exemple.</p>\n</section>\n<section id=\"styling-widget-classes\">\n<span id=\"id2\"></span><h3>Ajout de styles aux classes de composants<a class=\"heading-anchor\" href=\"#styling-widget-classes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Avec les composants, il est possible d’adjoindre des ressources (<code class=\"docutils literal notranslate\">css</code> et <code class=\"docutils literal notranslate\">javascript</code>) et de personnaliser plus encore leur apparence et leur comportement.</p>\n<p>Rapidement dit, il est nécessaire de créer une sous-classe du composant et de soit <a class=\"reference internal\" href=\"/fr/1.9/topics/forms/media/#assets-as-a-static-definition\"><span class=\"std std-ref\">définir une classe internet « Media »</span></a> ou de <a class=\"reference internal\" href=\"/fr/1.9/topics/forms/media/#dynamic-property\"><span class=\"std std-ref\">créer une propriété « media »</span></a>.</p>\n<p>Ces méthodes impliquent une utilisation relativement avancée de la programmation Python et sont décrites en détails dans le guide thématique des <a class=\"reference internal\" href=\"/fr/1.9/topics/forms/media/\"><span class=\"doc\">fichiers annexes de formulaires</span></a>.</p>\n</section>\n</section>\n<section id=\"base-widget-classes\">\n<span id=\"id3\"></span><h2>Classes <code class=\"docutils literal notranslate\">Widget</code> de base<a class=\"heading-anchor\" href=\"#base-widget-classes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les classes basiques de composants <a class=\"reference internal\" href=\"#django.forms.Widget\" title=\"django.forms.Widget\"><code class=\"xref py py-class docutils literal notranslate\">Widget</code></a> et <a class=\"reference internal\" href=\"#django.forms.MultiWidget\" title=\"django.forms.MultiWidget\"><code class=\"xref py py-class docutils literal notranslate\">MultiWidget</code></a> sont héritées par tous les <a class=\"reference internal\" href=\"#built-in-widgets\"><span class=\"std std-ref\">composants intégrés</span></a> et peuvent servir de fondement pour des composants personnalisés.</p>\n<section id=\"widget\">\n<h3><code class=\"docutils literal notranslate\">Widget</code><a class=\"heading-anchor\" href=\"#widget\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Widget\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Widget</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">attrs<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Widget\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cette classe abstraite ne peut pas être affichée telle quelle, mais elle fournit l’attribut de base <a class=\"reference internal\" href=\"#django.forms.Widget.attrs\" title=\"django.forms.Widget.attrs\"><code class=\"xref py py-attr docutils literal notranslate\">attrs</code></a>. Vous pouvez aussi implémenter ou surcharger la méthode <a class=\"reference internal\" href=\"#django.forms.Widget.render\" title=\"django.forms.Widget.render\"><code class=\"xref py py-meth docutils literal notranslate\">render()</code></a> dans des composants personnalisés.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Widget.attrs\">\n<span class=\"sig-name descname\">attrs</span><a class=\"heading-anchor\" href=\"#django.forms.Widget.attrs\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un dictionnaire contenant les attributs HTML à définir pour le composant affiché.</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"gp\">&gt;&gt;&gt; </span>name <span class=\"o\">=</span> forms<span class=\"o\">.</span>TextInput<span class=\"p\">(</span>attrs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;size&#39;</span><span class=\"p\">:</span> <span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"s1\">&#39;title&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;Your name&#39;</span><span class=\"p\">,})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>name<span class=\"o\">.</span>render<span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;A name&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;&lt;input title=&quot;Your name&quot; type=&quot;text&quot; name=&quot;name&quot; value=&quot;A name&quot; size=&quot;10&quot; /&gt;&#39;</span>\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.8</p><p>Si vous attribuez une valeur <code class=\"docutils literal notranslate\">True</code> ou <code class=\"docutils literal notranslate\">False</code> à un attribut, il sera généré comme un attribut HTML5 booléen :</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>name <span class=\"o\">=</span> forms<span class=\"o\">.</span>TextInput<span class=\"p\">(</span>attrs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;required&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>name<span class=\"o\">.</span>render<span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;A name&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;&lt;input name=&quot;name&quot; type=&quot;text&quot; value=&quot;A name&quot; required /&gt;&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>name <span class=\"o\">=</span> forms<span class=\"o\">.</span>TextInput<span class=\"p\">(</span>attrs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;required&#39;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>name<span class=\"o\">.</span>render<span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;A name&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;&lt;input name=&quot;name&quot; type=&quot;text&quot; value=&quot;A name&quot; /&gt;&#39;</span>\n</code></pre></div>\n</aside>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Widget.supports_microseconds\">\n<span class=\"sig-name descname\">supports_microseconds</span><a class=\"heading-anchor\" href=\"#django.forms.Widget.supports_microseconds\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un attribut qui vaut <code class=\"docutils literal notranslate\">True</code> par défaut. Si la valeur est <code class=\"docutils literal notranslate\">False</code>, les microsecondes faisant partie des valeurs <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime</code></a> et <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.time\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">time</code></a> sont mises à <code class=\"docutils literal notranslate\">0</code>.</p>\n<aside class=\"version-note version-added\" data-version=\"1.9\" role=\"note\">\n<p class=\"version-note-title\">New in Django 1.9</p><p>Dans les anciennes versions, cet attribut n’était défini que pour les composants date et heure (valait <code class=\"docutils literal notranslate\">False</code>).</p>\n</aside>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Widget.id_for_label\">\n<span class=\"sig-name descname\">id_for_label</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">self</em>, <em class=\"sig-param\">id_</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Widget.id_for_label\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie l’attribut HTML <code class=\"docutils literal notranslate\">id</code> de ce composant à l’usage de la balise <code class=\"docutils literal notranslate\">&lt;label&gt;</code>, en fonction de l’attribut <code class=\"docutils literal notranslate\">id</code> du champ. Renvoie <code class=\"docutils literal notranslate\">None</code> si <code class=\"docutils literal notranslate\">id</code> n’est pas disponible.</p>\n<p>Ce point d’entrée est nécessaire car certains composants possèdent plusieurs éléments HTML et donc plusieurs <code class=\"docutils literal notranslate\">id</code>. Dans ce cas, cette méthode doit renvoyer une valeur <code class=\"docutils literal notranslate\">id</code> qui correspond au premier <code class=\"docutils literal notranslate\">id</code> dans les balises du composant.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Widget.render\">\n<span class=\"sig-name descname\">render</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">name</em>, <em class=\"sig-param\">value</em>, <em class=\"sig-param\">attrs<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Widget.render\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie le code HTML du composant, sous forme de chaîne Unicode. Cette méthode doit être implémentée par la sous-classe, sous peine d’obtenir une exception <code class=\"docutils literal notranslate\">NotImplementedError</code>.</p>\n<p>Il n’est pas certain que aa valeur « value » donnée soit une saisie valide, il faut donc que les implémentations des sous-classes programment défensivement.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Widget.value_from_datadict\">\n<span class=\"sig-name descname\">value_from_datadict</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">data</em>, <em class=\"sig-param\">files</em>, <em class=\"sig-param\">name</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.Widget.value_from_datadict\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Étant donné un dictionnaire de données et le nom de ce composant, renvoie la valeur de ce composant. <code class=\"docutils literal notranslate\">files</code> peut contenir des données provenant de <a class=\"reference internal\" href=\"/fr/1.9/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a>. Renvoie <code class=\"docutils literal notranslate\">None</code> si aucune valeur n’a été fournie. Notez également que <code class=\"docutils literal notranslate\">value_from_datadict</code> peut être appelée plus d’une fois durant le traitement des données de formulaire, ce qui fait que si vous la personnalisez et que vous y effectuez un traitement lourd, il est recommandé de mettre en place un mécanisme de cache.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"multiwidget\">\n<h3><code class=\"docutils literal notranslate\">MultiWidget</code><a class=\"heading-anchor\" href=\"#multiwidget\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiWidget\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">MultiWidget</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">widgets</em>, <em class=\"sig-param\">attrs<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.MultiWidget\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un composant formé de plusieurs composants. <a class=\"reference internal\" href=\"#django.forms.MultiWidget\" title=\"django.forms.MultiWidget\"><code class=\"xref py py-class docutils literal notranslate\">MultiWidget</code></a> fonctionne de concert avec le champ <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.MultiValueField\" title=\"django.forms.MultiValueField\"><code class=\"xref py py-class docutils literal notranslate\">MultiValueField</code></a>.</p>\n<p><a class=\"reference internal\" href=\"#django.forms.MultiWidget\" title=\"django.forms.MultiWidget\"><code class=\"xref py py-class docutils literal notranslate\">MultiWidget</code></a> requiert un paramètre :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiWidget.widgets\">\n<span class=\"sig-name descname\">widgets</span><a class=\"heading-anchor\" href=\"#django.forms.MultiWidget.widgets\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un objet itérable contenant les composants nécessaires.</p>\n</dd></dl>\n\n<p>Ainsi qu’une méthode obligatoire :</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiWidget.decompress\">\n<span class=\"sig-name descname\">decompress</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.MultiWidget.decompress\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cette méthode accepte une seule valeur « compressée » à partir du champ et renvoie une liste de valeurs « décompressées ». La valeur d’entrée peut être considérée comme valide, mais pourrait être vide.</p>\n<p>Cette méthode <strong>doit être implémentée</strong> par la sous-classe, et comme la valeur peut être vide, l’implémentation doit être défensive.</p>\n<p>La logique de la « décompression » est qu’il est nécessaire de « scinder » la valeur combinée du champ de formulaire en valeurs distinctes pour chaque composant.</p>\n<p>Un exemple pour illustrer ce processus est la façon dont <a class=\"reference internal\" href=\"#django.forms.SplitDateTimeWidget\" title=\"django.forms.SplitDateTimeWidget\"><code class=\"xref py py-class docutils literal notranslate\">SplitDateTimeWidget</code></a> transforme une valeur <a class=\"reference external\" href=\"https://docs.python.org/3/library/datetime.html#datetime.datetime\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">datetime</code></a> en une liste où la date et l’heure sont séparées :</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=\"nn\">django.forms</span> <span class=\"kn\">import</span> MultiWidget\n\n<span class=\"k\">class</span> <span class=\"nc\">SplitDateTimeWidget</span><span class=\"p\">(</span>MultiWidget<span class=\"p\">):</span>\n\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">decompress</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <span class=\"k\">if</span> value<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[</span>value<span class=\"o\">.</span>date<span class=\"p\">(),</span> value<span class=\"o\">.</span>time<span class=\"p\">()</span><span class=\"o\">.</span>replace<span class=\"p\">(</span>microsecond<span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)]</span>\n        <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-tip\" role=\"note\">\n<p class=\"admonition-title\">Astuce</p>\n<p>Notez que <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.MultiValueField\" title=\"django.forms.MultiValueField\"><code class=\"xref py py-class docutils literal notranslate\">MultiValueField</code></a> possède une méthode complémentaire <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.MultiValueField.compress\" title=\"django.forms.MultiValueField.compress\"><code class=\"xref py py-meth docutils literal notranslate\">compress()</code></a> qui joue le rôle inverse, combiner les valeurs nettoyées de tous les sous-composants en une seule valeur.</p>\n</aside>\n</dd></dl>\n\n<p>Voici quelques autres méthodes dont la surcharge peut être utile :</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiWidget.render\">\n<span class=\"sig-name descname\">render</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">name</em>, <em class=\"sig-param\">value</em>, <em class=\"sig-param\">attrs<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.MultiWidget.render\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le paramètre <code class=\"docutils literal notranslate\">value</code> est traité différemment dans cette méthode que pour les autres sous-classes de <a class=\"reference internal\" href=\"#django.forms.Widget\" title=\"django.forms.Widget\"><code class=\"xref py py-class docutils literal notranslate\">Widget</code></a> parce qu’il s’agit de trouver comment scinder une valeur unique qui doit être affichée dans plusieurs composants.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\">value</code> utilisé lors de l’affichage peut se trouver sous deux formes :</p>\n<ul class=\"simple\">\n<li><p>Un objet <code class=\"docutils literal notranslate\">list</code>.</p></li>\n<li><p>Une valeur unique (c’est-à-dire une chaîne) représentant la version « compressée » d’une liste de valeurs.</p></li>\n</ul>\n<p>Si <code class=\"docutils literal notranslate\">value</code> est une liste, le résultat de <a class=\"reference internal\" href=\"#django.forms.MultiWidget.render\" title=\"django.forms.MultiWidget.render\"><code class=\"xref py py-meth docutils literal notranslate\">render()</code></a> sera une concaténation de l’affichage des composants enfants. Si <code class=\"docutils literal notranslate\">value</code> n’est pas une liste, elle sera d’abord traitée par la méthode <a class=\"reference internal\" href=\"#django.forms.MultiWidget.decompress\" title=\"django.forms.MultiWidget.decompress\"><code class=\"xref py py-meth docutils literal notranslate\">decompress()</code></a> pour créer la liste avant de procéder à l’affichage.</p>\n<p>Lorsque <code class=\"docutils literal notranslate\">render()</code> effectue l’affichage HTML, chaque valeur de la liste est affichée avec le composant correspondant, – la première valeur est produite avec le premier composant, la deuxième valeur est produite avec le deuxième composant, etc.</p>\n<p>Au contraire de ce qui se passe avec les composants à valeur unique, la méthode <a class=\"reference internal\" href=\"#django.forms.MultiWidget.render\" title=\"django.forms.MultiWidget.render\"><code class=\"xref py py-meth docutils literal notranslate\">render()</code></a> n’a pas besoin d’être implémentée par les sous-classes.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultiWidget.format_output\">\n<span class=\"sig-name descname\">format_output</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">rendered_widgets</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.forms.MultiWidget.format_output\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Étant donné une liste des composants affichés (sous forme de chaînes), renvoie une chaîne Unicode représentant le code HTML de l’ensemble.</p>\n<p>Ce point d’entrée permet de mettre en forme la disposition HTML des composants selon vos besoins.</p>\n</dd></dl>\n\n<p>Voici un exemple de composant héritant de <a class=\"reference internal\" href=\"#django.forms.MultiWidget\" title=\"django.forms.MultiWidget\"><code class=\"xref py py-class docutils literal notranslate\">MultiWidget</code></a> qui affiche une date avec le jour, le mois et l’année dans des listes déroulantes différentes. Ce composant est prévu pour être utilisé avec un champ <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a> plutôt qu’avec un <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.MultiValueField\" title=\"django.forms.MultiValueField\"><code class=\"xref py py-class docutils literal notranslate\">MultiValueField</code></a>, c’est pourquoi nous avons implémenté <a class=\"reference internal\" href=\"#django.forms.Widget.value_from_datadict\" title=\"django.forms.Widget.value_from_datadict\"><code class=\"xref py py-meth docutils literal notranslate\">value_from_datadict()</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=\"nn\">datetime</span> <span class=\"kn\">import</span> date\n<span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> widgets\n\n<span class=\"k\">class</span> <span class=\"nc\">DateSelectorWidget</span><span class=\"p\">(</span>widgets<span class=\"o\">.</span>MultiWidget<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> attrs<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        <span class=\"c1\"># create choices for days, months, years</span>\n        <span class=\"c1\"># example below, the rest snipped for brevity.</span>\n        years <span class=\"o\">=</span> <span class=\"p\">[(</span>year<span class=\"p\">,</span> year<span class=\"p\">)</span> <span class=\"k\">for</span> year <span class=\"ow\">in</span> <span class=\"p\">(</span><span class=\"mi\">2011</span><span class=\"p\">,</span> <span class=\"mi\">2012</span><span class=\"p\">,</span> <span class=\"mi\">2013</span><span class=\"p\">)]</span>\n        _widgets <span class=\"o\">=</span> <span class=\"p\">(</span>\n            widgets<span class=\"o\">.</span>Select<span class=\"p\">(</span>attrs<span class=\"o\">=</span>attrs<span class=\"p\">,</span> choices<span class=\"o\">=</span>days<span class=\"p\">),</span>\n            widgets<span class=\"o\">.</span>Select<span class=\"p\">(</span>attrs<span class=\"o\">=</span>attrs<span class=\"p\">,</span> choices<span class=\"o\">=</span>months<span class=\"p\">),</span>\n            widgets<span class=\"o\">.</span>Select<span class=\"p\">(</span>attrs<span class=\"o\">=</span>attrs<span class=\"p\">,</span> choices<span class=\"o\">=</span>years<span class=\"p\">),</span>\n        <span class=\"p\">)</span>\n        <span class=\"nb\">super</span><span class=\"p\">(</span>DateSelectorWidget<span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span>_widgets<span class=\"p\">,</span> attrs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">decompress</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <span class=\"k\">if</span> value<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[</span>value<span class=\"o\">.</span>day<span class=\"p\">,</span> value<span class=\"o\">.</span>month<span class=\"p\">,</span> value<span class=\"o\">.</span>year<span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">format_output</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> rendered_widgets<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s1\">&#39;&#39;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>rendered_widgets<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">value_from_datadict</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> data<span class=\"p\">,</span> files<span class=\"p\">,</span> name<span class=\"p\">):</span>\n        datelist <span class=\"o\">=</span> <span class=\"p\">[</span>\n            widget<span class=\"o\">.</span>value_from_datadict<span class=\"p\">(</span>data<span class=\"p\">,</span> files<span class=\"p\">,</span> name <span class=\"o\">+</span> <span class=\"s1\">&#39;_</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> i<span class=\"p\">)</span>\n            <span class=\"k\">for</span> i<span class=\"p\">,</span> widget <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>widgets<span class=\"p\">)]</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            D <span class=\"o\">=</span> date<span class=\"p\">(</span>\n                day<span class=\"o\">=</span><span class=\"nb\">int</span><span class=\"p\">(</span>datelist<span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]),</span>\n                month<span class=\"o\">=</span><span class=\"nb\">int</span><span class=\"p\">(</span>datelist<span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">]),</span>\n                year<span class=\"o\">=</span><span class=\"nb\">int</span><span class=\"p\">(</span>datelist<span class=\"p\">[</span><span class=\"mi\">2</span><span class=\"p\">]),</span>\n            <span class=\"p\">)</span>\n        <span class=\"k\">except</span> <span class=\"ne\">ValueError</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;&#39;</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"nb\">str</span><span class=\"p\">(</span>D<span class=\"p\">)</span>\n</code></pre></div>\n<p>Le constructeur crée plusieurs composants <a class=\"reference internal\" href=\"#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a> dans un tuple. La classe <code class=\"docutils literal notranslate\">super</code> utilise ce tuple pour configurer le composant.</p>\n<p>La méthode <a class=\"reference internal\" href=\"#django.forms.MultiWidget.format_output\" title=\"django.forms.MultiWidget.format_output\"><code class=\"xref py py-meth docutils literal notranslate\">format_output()</code></a> est assez standard ici (c’est en fait la même que celle qui a été implémentée par défaut pour <code class=\"docutils literal notranslate\">MultiWidget</code>), mais l’idée est que vous puissiez ajouter du code HTML personnalisé entre les composants en cas de besoin.</p>\n<p>La méthode obligatoire <a class=\"reference internal\" href=\"#django.forms.MultiWidget.decompress\" title=\"django.forms.MultiWidget.decompress\"><code class=\"xref py py-meth docutils literal notranslate\">decompress()</code></a> partage une valeur <code class=\"docutils literal notranslate\">datetime.date</code> en valeurs distinctes de jour, mois et année correspondant à chaque composant. Notez la manière dont la méthode traite le cas où <code class=\"docutils literal notranslate\">value</code> vaut <code class=\"docutils literal notranslate\">None</code>.</p>\n<p>Lîmplémentation par défaut de <a class=\"reference internal\" href=\"#django.forms.Widget.value_from_datadict\" title=\"django.forms.Widget.value_from_datadict\"><code class=\"xref py py-meth docutils literal notranslate\">value_from_datadict()</code></a> renvoie une liste de valeurs correspondant à chaque <code class=\"docutils literal notranslate\">Widget</code>. C’est le comportement correct lorsqu’un composant <code class=\"docutils literal notranslate\">MultiWidget</code> est utilisé de concert avec un champ <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.MultiValueField\" title=\"django.forms.MultiValueField\"><code class=\"xref py py-class docutils literal notranslate\">MultiValueField</code></a>, mais comme nous voulons utiliser ce composant avec un champ <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a> qui n’accepte qu’une seule valeur, nous avons surchargé la méthode afin de combiner les données de tous les sous-composants en un objet <code class=\"docutils literal notranslate\">datetime.date</code>. La méthode extrait les données du dictionnaire <code class=\"docutils literal notranslate\">POST</code>, puis construit et valide la date. Si elle est valide, la date sous forme de chaîne est renvoyée ; sinon une chaîne vide est renvoyée, ce qui fera que <code class=\"docutils literal notranslate\">form.is_valid</code> renverra <code class=\"docutils literal notranslate\">False</code>.</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"built-in-widgets\">\n<span id=\"id4\"></span><h2>Composants intégrés<a class=\"heading-anchor\" href=\"#built-in-widgets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dans son module <code class=\"docutils literal notranslate\">django.forms.widgets</code>, Django fournit une représentation de tous les composants HTML de base, plus certains groupes de composants fréquemment utilisés, y compris la <a class=\"reference internal\" href=\"#text-widgets\"><span class=\"std std-ref\">saisie de texte</span></a>, <a class=\"reference internal\" href=\"#selector-widgets\"><span class=\"std std-ref\">diverses cases à cocher et listes à choix</span></a>, l”<a class=\"reference internal\" href=\"#file-upload-widgets\"><span class=\"std std-ref\">envoi de fichiers</span></a> et le <a class=\"reference internal\" href=\"#composite-widgets\"><span class=\"std std-ref\">traitement de saisies à plusieurs valeurs</span></a>.</p>\n<section id=\"widgets-handling-input-of-text\">\n<span id=\"text-widgets\"></span><h3>Composants chargés de la saisie de texte<a class=\"heading-anchor\" href=\"#widgets-handling-input-of-text\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ces composants font usage des éléments HTML <code class=\"docutils literal notranslate\">input</code> et <code class=\"docutils literal notranslate\">textarea</code>.</p>\n<section id=\"textinput\">\n<h4><code class=\"docutils literal notranslate\">TextInput</code><a class=\"heading-anchor\" href=\"#textinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.TextInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TextInput</span><a class=\"heading-anchor\" href=\"#django.forms.TextInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Zone de saisie de texte : <code class=\"docutils literal notranslate\">&lt;input type=&quot;text&quot; ...&gt;</code></p>\n</dd></dl>\n\n</section>\n<section id=\"numberinput\">\n<h4><code class=\"docutils literal notranslate\">NumberInput</code><a class=\"heading-anchor\" href=\"#numberinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.NumberInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">NumberInput</span><a class=\"heading-anchor\" href=\"#django.forms.NumberInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Zone de saisie de texte : <code class=\"docutils literal notranslate\">&lt;input type=&quot;number&quot; ...&gt;</code></p>\n<p>Il faut savoir que certains navigateurs ne gèrent pas correctement la saisie de nombres régionalisés dans les types de zones <code class=\"docutils literal notranslate\">number</code>. Django lui-même évite de les utiliser pour les champs dont la propriété <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.Field.localize\" title=\"django.forms.Field.localize\"><code class=\"xref py py-attr docutils literal notranslate\">localize</code></a> est <code class=\"docutils literal notranslate\">True</code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"emailinput\">\n<h4><code class=\"docutils literal notranslate\">EmailInput</code><a class=\"heading-anchor\" href=\"#emailinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.EmailInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">EmailInput</span><a class=\"heading-anchor\" href=\"#django.forms.EmailInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Zone de saisie de texte : <code class=\"docutils literal notranslate\">&lt;input type=&quot;email&quot; ...&gt;</code></p>\n</dd></dl>\n\n</section>\n<section id=\"urlinput\">\n<h4><code class=\"docutils literal notranslate\">URLInput</code><a class=\"heading-anchor\" href=\"#urlinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.URLInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">URLInput</span><a class=\"heading-anchor\" href=\"#django.forms.URLInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Zone de saisie de texte : <code class=\"docutils literal notranslate\">&lt;input type=&quot;url&quot; ...&gt;</code></p>\n</dd></dl>\n\n</section>\n<section id=\"passwordinput\">\n<h4><code class=\"docutils literal notranslate\">PasswordInput</code><a class=\"heading-anchor\" href=\"#passwordinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.PasswordInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">PasswordInput</span><a class=\"heading-anchor\" href=\"#django.forms.PasswordInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Saisie de mots de passe : <code class=\"docutils literal notranslate\">&lt;input type='password' ...&gt;</code></p>\n<p>Accepte un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.PasswordInput.render_value\">\n<span class=\"sig-name descname\">render_value</span><a class=\"heading-anchor\" href=\"#django.forms.PasswordInput.render_value\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Détermine si le composant contient une valeur lorsque le formulaire est réaffiché après une erreur de validation (la valeur par défaut est <code class=\"docutils literal notranslate\">False</code>).</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"hiddeninput\">\n<h4><code class=\"docutils literal notranslate\">HiddenInput</code><a class=\"heading-anchor\" href=\"#hiddeninput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.HiddenInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">HiddenInput</span><a class=\"heading-anchor\" href=\"#django.forms.HiddenInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Zone de saisie masquée : <code class=\"docutils literal notranslate\">&lt;input type='hidden' ...&gt;</code></p>\n<p>Notez qu’il existe également un composant <a class=\"reference internal\" href=\"#django.forms.MultipleHiddenInput\" title=\"django.forms.MultipleHiddenInput\"><code class=\"xref py py-class docutils literal notranslate\">MultipleHiddenInput</code></a> qui regroupe un ensemble de zones de saisie masquées.</p>\n</dd></dl>\n\n</section>\n<section id=\"dateinput\">\n<h4><code class=\"docutils literal notranslate\">DateInput</code><a class=\"heading-anchor\" href=\"#dateinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DateInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DateInput</span><a class=\"heading-anchor\" href=\"#django.forms.DateInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Saisie de date sous forme de zone de texte simple : <code class=\"docutils literal notranslate\">&lt;input type='text' ...&gt;</code></p>\n<p>Accepte les mêmes paramètres que <a class=\"reference internal\" href=\"#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a>, avec en plus un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DateInput.format\">\n<span class=\"sig-name descname\">format</span><a class=\"heading-anchor\" href=\"#django.forms.DateInput.format\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le format dans lequel la valeur initiale du champ est affichée.</p>\n</dd></dl>\n\n<p>Si aucun paramètre <code class=\"docutils literal notranslate\">format</code> n’est indiqué, le format par défaut est le premier format trouvé dans <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DATE_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATE_INPUT_FORMATS</code></a> en respectant la <a class=\"reference internal\" href=\"/fr/1.9/topics/i18n/formatting/\"><span class=\"doc\">Régionalisation des formats</span></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"datetimeinput\">\n<h4><code class=\"docutils literal notranslate\">DateTimeInput</code><a class=\"heading-anchor\" href=\"#datetimeinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DateTimeInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">DateTimeInput</span><a class=\"heading-anchor\" href=\"#django.forms.DateTimeInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Saisie de date/heure sous forme de zone de texte simple : <code class=\"docutils literal notranslate\">&lt;input type='text' ...&gt;</code></p>\n<p>Accepte les mêmes paramètres que <a class=\"reference internal\" href=\"#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a>, avec en plus un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.DateTimeInput.format\">\n<span class=\"sig-name descname\">format</span><a class=\"heading-anchor\" href=\"#django.forms.DateTimeInput.format\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le format dans lequel la valeur initiale du champ est affichée.</p>\n</dd></dl>\n\n<p>Si aucun paramètre <code class=\"docutils literal notranslate\">format</code> n’est indiqué, le format par défaut est le premier format trouvé dans <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-DATETIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATETIME_INPUT_FORMATS</code></a> en respectant la <a class=\"reference internal\" href=\"/fr/1.9/topics/i18n/formatting/\"><span class=\"doc\">Régionalisation des formats</span></a>.</p>\n<p>Par défaut, la partie microsecondes de la valeur de temps est toujours définie à <code class=\"docutils literal notranslate\">0</code>. Si les microsecondes sont nécessaires, créez une sous-classe avec l’attribut <a class=\"reference internal\" href=\"#django.forms.Widget.supports_microseconds\" title=\"django.forms.Widget.supports_microseconds\"><code class=\"xref py py-attr docutils literal notranslate\">supports_microseconds</code></a> défini à <code class=\"docutils literal notranslate\">True</code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"timeinput\">\n<h4><code class=\"docutils literal notranslate\">TimeInput</code><a class=\"heading-anchor\" href=\"#timeinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.TimeInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TimeInput</span><a class=\"heading-anchor\" href=\"#django.forms.TimeInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Saisie d’heure sous forme de zone de texte simple : <code class=\"docutils literal notranslate\">&lt;input type='text' ...&gt;</code></p>\n<p>Accepte les mêmes paramètres que <a class=\"reference internal\" href=\"#django.forms.TextInput\" title=\"django.forms.TextInput\"><code class=\"xref py py-class docutils literal notranslate\">TextInput</code></a>, avec en plus un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.TimeInput.format\">\n<span class=\"sig-name descname\">format</span><a class=\"heading-anchor\" href=\"#django.forms.TimeInput.format\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Le format dans lequel la valeur initiale du champ est affichée.</p>\n</dd></dl>\n\n<p>Si aucun paramètre <code class=\"docutils literal notranslate\">format</code> n’est indiqué, le format par défaut est le premier format trouvé dans <a class=\"reference internal\" href=\"/fr/1.9/ref/settings/#std-setting-TIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_INPUT_FORMATS</code></a> en respectant la <a class=\"reference internal\" href=\"/fr/1.9/topics/i18n/formatting/\"><span class=\"doc\">Régionalisation des formats</span></a>.</p>\n<p>Pour le traitement des microsecondes, référez-vous à <a class=\"reference internal\" href=\"#django.forms.DateTimeInput\" title=\"django.forms.DateTimeInput\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeInput</code></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"textarea\">\n<h4><code class=\"docutils literal notranslate\">Textarea</code><a class=\"heading-anchor\" href=\"#textarea\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Textarea\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Textarea</span><a class=\"heading-anchor\" href=\"#django.forms.Textarea\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Zone de texte étendue : <code class=\"docutils literal notranslate\">&lt;textarea&gt;...&lt;/textarea&gt;</code></p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"selector-and-checkbox-widgets\">\n<span id=\"selector-widgets\"></span><h3>Composants cases à cocher et listes à choix<a class=\"heading-anchor\" href=\"#selector-and-checkbox-widgets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"checkboxinput\">\n<h4><code class=\"docutils literal notranslate\">CheckboxInput</code><a class=\"heading-anchor\" href=\"#checkboxinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.CheckboxInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">CheckboxInput</span><a class=\"heading-anchor\" href=\"#django.forms.CheckboxInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Case à cocher : <code class=\"docutils literal notranslate\">&lt;input type='checkbox' ...&gt;</code></p>\n<p>Accepte un paramètre facultatif :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.CheckboxInput.check_test\">\n<span class=\"sig-name descname\">check_test</span><a class=\"heading-anchor\" href=\"#django.forms.CheckboxInput.check_test\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un objet exécutable acceptant la valeur de <code class=\"docutils literal notranslate\">CheckboxInput</code> et renvoyant <code class=\"docutils literal notranslate\">True</code> si la case à cocher doit apparaître cochée pour cette valeur.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"select\">\n<h4><code class=\"docutils literal notranslate\">Select</code><a class=\"heading-anchor\" href=\"#select\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Select\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Select</span><a class=\"heading-anchor\" href=\"#django.forms.Select\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Composant de liste à choix : <code class=\"docutils literal notranslate\">&lt;select&gt;&lt;option ...&gt;...&lt;/select&gt;</code></p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.Select.choices\">\n<span class=\"sig-name descname\">choices</span><a class=\"heading-anchor\" href=\"#django.forms.Select.choices\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cet attribut est facultatif lorsque le champ de formulaire n’a pas d’attribut <code class=\"docutils literal notranslate\">choices</code>. Si l’attribut de champ est présent, il écrase tout ce que vous pourriez définir ici au moment où l’attribut est mis à jour au niveau du champ <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"nullbooleanselect\">\n<h4><code class=\"docutils literal notranslate\">NullBooleanSelect</code><a class=\"heading-anchor\" href=\"#nullbooleanselect\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.NullBooleanSelect\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">NullBooleanSelect</span><a class=\"heading-anchor\" href=\"#django.forms.NullBooleanSelect\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Composant de liste à choix avec les options « Inconnu », « Oui » et « Non »</p>\n</dd></dl>\n\n</section>\n<section id=\"selectmultiple\">\n<h4><code class=\"docutils literal notranslate\">SelectMultiple</code><a class=\"heading-anchor\" href=\"#selectmultiple\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SelectMultiple\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">SelectMultiple</span><a class=\"heading-anchor\" href=\"#django.forms.SelectMultiple\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Semblable à <a class=\"reference internal\" href=\"#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a>, mais autorise les sélections multiples : <code class=\"docutils literal notranslate\">&lt;select multiple='multiple'&gt;...&lt;/select&gt;</code></p>\n</dd></dl>\n\n</section>\n<section id=\"radioselect\">\n<h4><code class=\"docutils literal notranslate\">RadioSelect</code><a class=\"heading-anchor\" href=\"#radioselect\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.RadioSelect\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">RadioSelect</span><a class=\"heading-anchor\" href=\"#django.forms.RadioSelect\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Semblable à <a class=\"reference internal\" href=\"#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a>, mais affiché sous forme de liste de boutons radio dans des balises <code class=\"docutils literal notranslate\">&lt;li&gt;</code>:</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\">ul</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&#39;radio&#39;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&#39;...&#39;</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n  ...\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Pour un contrôle plus fin du balisage produit, vous pouvez passer en boucle les boutons radio dans le gabarit. En prenant comme exemple un formulaire <code class=\"docutils literal notranslate\">myform</code> avec un champ <code class=\"docutils literal notranslate\">beatles</code> utilisant un composant <code class=\"docutils literal notranslate\">RadioSelect</code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">radio</span> <span class=\"k\">in</span> <span class=\"nv\">myform.beatles</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;myradio&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{{</span> <span class=\"nv\">radio</span> <span class=\"cp\">}}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Cela produirait le code HTML suivant :</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\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;myradio&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_beatles_0&quot;</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;id_beatles_0&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;beatles&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;john&quot;</span> <span class=\"p\">/&gt;</span> John<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;myradio&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_beatles_1&quot;</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;id_beatles_1&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;beatles&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;paul&quot;</span> <span class=\"p\">/&gt;</span> Paul<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;myradio&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_beatles_2&quot;</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;id_beatles_2&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;beatles&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;george&quot;</span> <span class=\"p\">/&gt;</span> George<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">div</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;myradio&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_beatles_3&quot;</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;id_beatles_3&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;beatles&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;ringo&quot;</span> <span class=\"p\">/&gt;</span> Ringo<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">div</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Les balises <code class=\"docutils literal notranslate\">&lt;label&gt;</code> y figurent également. Pour un contrôle encore plus fin, vous pouvez utiliser les attributs <code class=\"docutils literal notranslate\">tag</code>, <code class=\"docutils literal notranslate\">choice_label</code> et <code class=\"docutils literal notranslate\">id_for_label</code> de chaque bouton radio. Par exemple, ce gabarit…</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">radio</span> <span class=\"k\">in</span> <span class=\"nv\">myform.beatles</span> <span class=\"cp\">%}</span>\n    <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\">radio.id_for_label</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{{</span> <span class=\"nv\">radio.choice_label</span> <span class=\"cp\">}}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">radio.tag</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>…produit le code HTML suivant :</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;id_beatles_0&quot;</span><span class=\"p\">&gt;</span>\n    John\n    <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</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;id_beatles_0&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;beatles&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;john&quot;</span> <span class=\"p\">/&gt;&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_beatles_1&quot;</span><span class=\"p\">&gt;</span>\n    Paul\n    <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</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;id_beatles_1&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;beatles&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;paul&quot;</span> <span class=\"p\">/&gt;&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_beatles_2&quot;</span><span class=\"p\">&gt;</span>\n    George\n    <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</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;id_beatles_2&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;beatles&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;george&quot;</span> <span class=\"p\">/&gt;&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">label</span> <span class=\"na\">for</span><span class=\"o\">=</span><span class=\"s\">&quot;id_beatles_3&quot;</span><span class=\"p\">&gt;</span>\n    Ringo\n    <span class=\"p\">&lt;</span><span class=\"nt\">span</span> <span class=\"na\">class</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</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;id_beatles_3&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;beatles&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;radio&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;ringo&quot;</span> <span class=\"p\">/&gt;&lt;/</span><span class=\"nt\">span</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">label</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Si vous décidez de ne pas passer en boucle les boutons radio, par exemple si le gabarit contient simplement <code class=\"docutils literal notranslate\">{{ myform.beatles }}</code>, ils seront contenus dans un élément <code class=\"docutils literal notranslate\">&lt;ul&gt;</code> avec des balises <code class=\"docutils literal notranslate\">&lt;li&gt;</code>, comme ci-dessus.</p>\n<p>The outer <code class=\"docutils literal notranslate\">&lt;ul&gt;</code> container receives the <code class=\"docutils literal notranslate\">id</code> attribute of the widget,\nif defined, or <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/api/#django.forms.BoundField.auto_id\" title=\"django.forms.BoundField.auto_id\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.auto_id</code></a> otherwise.</p>\n<p>Lors de l’itération sur les boutons radio, les balises``label`` and <code class=\"docutils literal notranslate\">input</code>  incluent les attributs <code class=\"docutils literal notranslate\">for</code> et <code class=\"docutils literal notranslate\">id</code>, respectivement. Chaque bouton radio inclut un attribut <code class=\"docutils literal notranslate\">id_for_label</code> produisant l’ID de l’élément.</p>\n</dd></dl>\n\n</section>\n<section id=\"checkboxselectmultiple\">\n<h4><code class=\"docutils literal notranslate\">CheckboxSelectMultiple</code><a class=\"heading-anchor\" href=\"#checkboxselectmultiple\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.CheckboxSelectMultiple\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">CheckboxSelectMultiple</span><a class=\"heading-anchor\" href=\"#django.forms.CheckboxSelectMultiple\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Semblable à <a class=\"reference internal\" href=\"#django.forms.SelectMultiple\" title=\"django.forms.SelectMultiple\"><code class=\"xref py py-class docutils literal notranslate\">SelectMultiple</code></a>, mais affiché sous forme de liste de cases à cocher :</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\">ul</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">li</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&#39;checkbox&#39;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&#39;...&#39;</span> <span class=\"p\">&gt;&lt;/</span><span class=\"nt\">li</span><span class=\"p\">&gt;</span>\n  ...\n<span class=\"p\">&lt;/</span><span class=\"nt\">ul</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>The outer <code class=\"docutils literal notranslate\">&lt;ul&gt;</code> container receives the <code class=\"docutils literal notranslate\">id</code> attribute of the widget,\nif defined, or <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/api/#django.forms.BoundField.auto_id\" title=\"django.forms.BoundField.auto_id\"><code class=\"xref py py-attr docutils literal notranslate\">BoundField.auto_id</code></a> otherwise.</p>\n</dd></dl>\n\n<p>Comme pour <a class=\"reference internal\" href=\"#django.forms.RadioSelect\" title=\"django.forms.RadioSelect\"><code class=\"xref py py-class docutils literal notranslate\">RadioSelect</code></a>, vous pouvez maintenant passer en boucle les cases à cocher individuelles composant les listes. Consultez la documentation de <a class=\"reference internal\" href=\"#django.forms.RadioSelect\" title=\"django.forms.RadioSelect\"><code class=\"xref py py-class docutils literal notranslate\">RadioSelect</code></a> pour plus de détails.</p>\n<p>Lors de l’itération sur les cases à cocher, les balises``label`` and <code class=\"docutils literal notranslate\">input</code>  incluent les attributs <code class=\"docutils literal notranslate\">for</code> et <code class=\"docutils literal notranslate\">id</code>, respectivement. Chaque case à cocher inclut un attribut <code class=\"docutils literal notranslate\">id_for_label</code> produisant l’ID de l’élément.</p>\n</section>\n</section>\n<section id=\"file-upload-widgets\">\n<span id=\"id5\"></span><h3>Composants d’envoi de fichier<a class=\"heading-anchor\" href=\"#file-upload-widgets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"fileinput\">\n<h4><code class=\"docutils literal notranslate\">FileInput</code><a class=\"heading-anchor\" href=\"#fileinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.FileInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">FileInput</span><a class=\"heading-anchor\" href=\"#django.forms.FileInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Sélection de fichier à envoyer : <code class=\"docutils literal notranslate\">&lt;input type='file' ...&gt;</code></p>\n</dd></dl>\n\n</section>\n<section id=\"clearablefileinput\">\n<h4><code class=\"docutils literal notranslate\">ClearableFileInput</code><a class=\"heading-anchor\" href=\"#clearablefileinput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.ClearableFileInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ClearableFileInput</span><a class=\"heading-anchor\" href=\"#django.forms.ClearableFileInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Sélection de fichier à envoyer : <code class=\"docutils literal notranslate\">&lt;input type='file' ...&gt;</code>, avec une case à cocher supplémentaire pour effacer la valeur du champ, si le champ n’est pas obligatoire et qu’il comporte une donnée initiale.</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"composite-widgets\">\n<span id=\"id6\"></span><h3>Composants multiples<a class=\"heading-anchor\" href=\"#composite-widgets\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"multiplehiddeninput\">\n<h4><code class=\"docutils literal notranslate\">MultipleHiddenInput</code><a class=\"heading-anchor\" href=\"#multiplehiddeninput\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultipleHiddenInput\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">MultipleHiddenInput</span><a class=\"heading-anchor\" href=\"#django.forms.MultipleHiddenInput\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Plusieurs composants <code class=\"docutils literal notranslate\">&lt;input type='hidden' ...&gt;</code>.</p>\n<p>Un composant qui gère plusieurs composants masqués pour des champs qui possèdent une liste de valeurs.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.MultipleHiddenInput.choices\">\n<span class=\"sig-name descname\">choices</span><a class=\"heading-anchor\" href=\"#django.forms.MultipleHiddenInput.choices\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cet attribut est facultatif lorsque le champ de formulaire n’a pas d’attribut <code class=\"docutils literal notranslate\">choices</code>. Si l’attribut de champ est présent, il écrase tout ce que vous pourriez définir ici au moment où l’attribut est mis à jour au niveau du champ <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"splitdatetimewidget\">\n<h4><code class=\"docutils literal notranslate\">SplitDateTimeWidget</code><a class=\"heading-anchor\" href=\"#splitdatetimewidget\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SplitDateTimeWidget\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">SplitDateTimeWidget</span><a class=\"heading-anchor\" href=\"#django.forms.SplitDateTimeWidget\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Wrapper (using <a class=\"reference internal\" href=\"#django.forms.MultiWidget\" title=\"django.forms.MultiWidget\"><code class=\"xref py py-class docutils literal notranslate\">MultiWidget</code></a>) around two widgets: <a class=\"reference internal\" href=\"#django.forms.DateInput\" title=\"django.forms.DateInput\"><code class=\"xref py py-class docutils literal notranslate\">DateInput</code></a>\nfor the date, and <a class=\"reference internal\" href=\"#django.forms.TimeInput\" title=\"django.forms.TimeInput\"><code class=\"xref py py-class docutils literal notranslate\">TimeInput</code></a> for the time. Must be used with\n<a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.SplitDateTimeField\" title=\"django.forms.SplitDateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">SplitDateTimeField</code></a> rather than <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.DateTimeField\" title=\"django.forms.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</code></a>.</p>\n<p><code class=\"docutils literal notranslate\">SplitDateTimeWidget</code> contient deux attributs facultatifs :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SplitDateTimeWidget.date_format\">\n<span class=\"sig-name descname\">date_format</span><a class=\"heading-anchor\" href=\"#django.forms.SplitDateTimeWidget.date_format\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Semblable à <a class=\"reference internal\" href=\"#django.forms.DateInput.format\" title=\"django.forms.DateInput.format\"><code class=\"xref py py-attr docutils literal notranslate\">DateInput.format</code></a></p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SplitDateTimeWidget.time_format\">\n<span class=\"sig-name descname\">time_format</span><a class=\"heading-anchor\" href=\"#django.forms.SplitDateTimeWidget.time_format\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Semblable à <a class=\"reference internal\" href=\"#django.forms.TimeInput.format\" title=\"django.forms.TimeInput.format\"><code class=\"xref py py-attr docutils literal notranslate\">TimeInput.format</code></a></p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"splithiddendatetimewidget\">\n<h4><code class=\"docutils literal notranslate\">SplitHiddenDateTimeWidget</code><a class=\"heading-anchor\" href=\"#splithiddendatetimewidget\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SplitHiddenDateTimeWidget\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">SplitHiddenDateTimeWidget</span><a class=\"heading-anchor\" href=\"#django.forms.SplitHiddenDateTimeWidget\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Semblable à <a class=\"reference internal\" href=\"#django.forms.SplitDateTimeWidget\" title=\"django.forms.SplitDateTimeWidget\"><code class=\"xref py py-class docutils literal notranslate\">SplitDateTimeWidget</code></a>, mais utilise <a class=\"reference internal\" href=\"#django.forms.HiddenInput\" title=\"django.forms.HiddenInput\"><code class=\"xref py py-class docutils literal notranslate\">HiddenInput</code></a> à la fois pour la date et l’heure.</p>\n</dd></dl>\n\n</section>\n<section id=\"selectdatewidget\">\n<h4><code class=\"docutils literal notranslate\">SelectDateWidget</code><a class=\"heading-anchor\" href=\"#selectdatewidget\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SelectDateWidget\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">SelectDateWidget</span><a class=\"heading-anchor\" href=\"#django.forms.SelectDateWidget\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Composant parent de trois sous-composants <a class=\"reference internal\" href=\"#django.forms.Select\" title=\"django.forms.Select\"><code class=\"xref py py-class docutils literal notranslate\">Select</code></a> pour le mois, le jour et l’année.</p>\n<p>Accepte plusieurs paramètres facultatifs :</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SelectDateWidget.years\">\n<span class=\"sig-name descname\">years</span><a class=\"heading-anchor\" href=\"#django.forms.SelectDateWidget.years\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Une liste (ou tuple) facultative d’années à présenter dans la liste à choix « year ». La valeur par défaut est une liste contenant l’année en cours et les 9 années suivantes.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SelectDateWidget.months\">\n<span class=\"sig-name descname\">months</span><a class=\"heading-anchor\" href=\"#django.forms.SelectDateWidget.months\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Un dictionnaire facultatif de mois à utiliser dans la liste de sélection « months ».</p>\n<p>Les clés du dictionnaire correspondent au numéro du mois (indice à partir de 1) et les valeurs sont les mois affiché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>MONTHS <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"mi\">1</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;jan&#39;</span><span class=\"p\">),</span> <span class=\"mi\">2</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;feb&#39;</span><span class=\"p\">),</span> <span class=\"mi\">3</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;mar&#39;</span><span class=\"p\">),</span> <span class=\"mi\">4</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;apr&#39;</span><span class=\"p\">),</span>\n    <span class=\"mi\">5</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;may&#39;</span><span class=\"p\">),</span> <span class=\"mi\">6</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;jun&#39;</span><span class=\"p\">),</span> <span class=\"mi\">7</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;jul&#39;</span><span class=\"p\">),</span> <span class=\"mi\">8</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;aug&#39;</span><span class=\"p\">),</span>\n    <span class=\"mi\">9</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;sep&#39;</span><span class=\"p\">),</span> <span class=\"mi\">10</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;oct&#39;</span><span class=\"p\">),</span> <span class=\"mi\">11</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;nov&#39;</span><span class=\"p\">),</span> <span class=\"mi\">12</span><span class=\"p\">:</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;dec&#39;</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.forms.SelectDateWidget.empty_label\">\n<span class=\"sig-name descname\">empty_label</span><a class=\"heading-anchor\" href=\"#django.forms.SelectDateWidget.empty_label\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"version-note version-added\" data-version=\"1.8\" role=\"note\">\n<p class=\"version-note-title\">New in Django 1.8</p></aside>\n<p>Si le champ <a class=\"reference internal\" href=\"/fr/1.9/ref/forms/fields/#django.forms.DateField\" title=\"django.forms.DateField\"><code class=\"xref py py-class docutils literal notranslate\">DateField</code></a> n’est pas obligatoire, <a class=\"reference internal\" href=\"#django.forms.SelectDateWidget\" title=\"django.forms.SelectDateWidget\"><code class=\"xref py py-class docutils literal notranslate\">SelectDateWidget</code></a> comportera un choix vide au sommet de la liste (qui s’affiche comme <code class=\"docutils literal notranslate\">---</code> par défaut). Vous pouvez modifier le texte de ce choix avec l’attribut <code class=\"docutils literal notranslate\">empty_label</code>. <code class=\"docutils literal notranslate\">empty_label</code> peut être une chaîne, une liste ou un tuple. Lorsqu’une chaîne est utilisée, toutes les listes de choix auront chacune un choix vide avec ce contenu. Si <code class=\"docutils literal notranslate\">empty_label</code> est une liste ou un tuple de 3 éléments textuels, les listes de choix possèdent chacune leur propre contenu. Les textes doivent apparaître dans cet ordre : <code class=\"docutils literal notranslate\">('texte_année', 'texte_mois', 'texte_jour')</code>.</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"c1\"># A custom empty label with string</span>\nfield1 <span class=\"o\">=</span> forms<span class=\"o\">.</span>DateField<span class=\"p\">(</span>widget<span class=\"o\">=</span>SelectDateWidget<span class=\"p\">(</span>empty_label<span class=\"o\">=</span><span class=\"s2\">&quot;Nothing&quot;</span><span class=\"p\">))</span>\n\n<span class=\"c1\"># A custom empty label with tuple</span>\nfield1 <span class=\"o\">=</span> forms<span class=\"o\">.</span>DateField<span class=\"p\">(</span>\n    widget<span class=\"o\">=</span>SelectDateWidget<span class=\"p\">(</span>\n        empty_label<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;Choose Year&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Choose Month&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Choose Day&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<aside class=\"version-note version-changed\" data-version=\"1.9\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 1.9</p><p>Ce composant se trouvait précédemment dans le module <code class=\"docutils literal notranslate\">django.forms.extras.widgets</code>. Il est maintenant défini dans <code class=\"docutils literal notranslate\">django.forms.widgets</code> et il peut être directement importé depuis <code class=\"docutils literal notranslate\">django.forms</code> comme les autres composants.</p>\n</aside>\n</dd></dl>\n\n</section>\n</section>\n</section>","rootId":"module-django.forms.widgets","toc":[{"title":"Définition des composants","anchor":"specifying-widgets","children":[]},{"title":"Définition de paramètres pour les composants","anchor":"setting-arguments-for-widgets","children":[]},{"title":"Composants héritant du composant Select","anchor":"widgets-inheriting-from-the-select-widget","children":[]},{"title":"Personnalisation des instances de composants","anchor":"customizing-widget-instances","children":[{"title":"Ajout de styles aux instances de composants","anchor":"styling-widget-instances","children":[]},{"title":"Ajout de styles aux classes de composants","anchor":"styling-widget-classes","children":[]}]},{"title":"Classes Widget de base","anchor":"base-widget-classes","children":[{"title":"Widget","anchor":"widget","children":[]},{"title":"MultiWidget","anchor":"multiwidget","children":[]}]},{"title":"Composants intégrés","anchor":"built-in-widgets","children":[{"title":"Composants chargés de la saisie de texte","anchor":"widgets-handling-input-of-text","children":[{"title":"TextInput","anchor":"textinput","children":[]},{"title":"NumberInput","anchor":"numberinput","children":[]},{"title":"EmailInput","anchor":"emailinput","children":[]},{"title":"URLInput","anchor":"urlinput","children":[]},{"title":"PasswordInput","anchor":"passwordinput","children":[]},{"title":"HiddenInput","anchor":"hiddeninput","children":[]},{"title":"DateInput","anchor":"dateinput","children":[]},{"title":"DateTimeInput","anchor":"datetimeinput","children":[]},{"title":"TimeInput","anchor":"timeinput","children":[]},{"title":"Textarea","anchor":"textarea","children":[]}]},{"title":"Composants cases à cocher et listes à choix","anchor":"selector-and-checkbox-widgets","children":[{"title":"CheckboxInput","anchor":"checkboxinput","children":[]},{"title":"Select","anchor":"select","children":[]},{"title":"NullBooleanSelect","anchor":"nullbooleanselect","children":[]},{"title":"SelectMultiple","anchor":"selectmultiple","children":[]},{"title":"RadioSelect","anchor":"radioselect","children":[]},{"title":"CheckboxSelectMultiple","anchor":"checkboxselectmultiple","children":[]}]},{"title":"Composants d’envoi de fichier","anchor":"file-upload-widgets","children":[{"title":"FileInput","anchor":"fileinput","children":[]},{"title":"ClearableFileInput","anchor":"clearablefileinput","children":[]}]},{"title":"Composants multiples","anchor":"composite-widgets","children":[{"title":"MultipleHiddenInput","anchor":"multiplehiddeninput","children":[]},{"title":"SplitDateTimeWidget","anchor":"splitdatetimewidget","children":[]},{"title":"SplitHiddenDateTimeWidget","anchor":"splithiddendatetimewidget","children":[]},{"title":"SelectDateWidget","anchor":"selectdatewidget","children":[]}]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/1.9/ref/"},{"docname":"ref/forms/index","title":"Formulaires","url":"/fr/1.9/ref/forms/"}],"prev":{"docname":"ref/forms/formsets","title":"Fonctions de formulaires groupés","url":"/fr/1.9/ref/forms/formsets/"},"next":{"docname":"ref/forms/validation","title":"La validation de formulaires et de champs","url":"/fr/1.9/ref/forms/validation/"},"formats":{"html":"/fr/1.9/ref/forms/widgets/","markdown":"/fr/1.9/ref/forms/widgets.md","json":"/fr/1.9/ref/forms/widgets.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/ref/forms/widgets.txt","official":"https://docs.djangoproject.com/fr/1.9/ref/forms/widgets/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","es"]}