Champs de formulairesLien vers cette rubrique

class FieldLien vers cette définition

Lorsque vous créez une classe Form, la partie la plus importante est de définir les champs du formulaire. Chaque champ possède sa propre logique de validation, ainsi que quelques autres points d’entrée.

Field.clean(value)Lien vers cette définition

Même si l’emploi principal des classes Field concerne la définition de classes Form, il est aussi possible de les instancier et de les utiliser directement pour obtenir une meilleure idée de leur fonctionnement. Chaque instance Field possède une méthode clean() acceptant un seul paramètre et qui renvoie une valeur « nettoyée » ou qui génère une exception django.core.exceptions.ValidationError:

Python console
>>> from django import forms
>>> f = forms.EmailField()
>>> f.clean("foo@example.com")
'foo@example.com'
>>> f.clean("invalid email address")
Traceback (most recent call last):
...
ValidationError: ['Enter a valid email address.']

Paramètres principaux des champsLien vers cette rubrique

Chaque constructeur de classe Field accepte au moins trois paramètres. Certaines classes acceptent d’autres paramètres spécifiques à la classe, mais ceux qui suivent sont toujours acceptés :

requiredLien vers cette rubrique

Field.requiredLien vers cette définition

Par défaut, chaque classe Field suppose qu’une valeur est obligatoire, ce qui fait que si vous ne fournissez pas de valeur (que ce soit None ou une chaîne vide("")), clean() génère une exception ValidationError:

Python console
>>> from django import forms
>>> f = forms.CharField()
>>> f.clean("foo")
'foo'
>>> f.clean("")
Traceback (most recent call last):
...
ValidationError: ['This field is required.']
>>> f.clean(None)
Traceback (most recent call last):
...
ValidationError: ['This field is required.']
>>> f.clean(" ")
' '
>>> f.clean(0)
'0'
>>> f.clean(True)
'True'
>>> f.clean(False)
'False'

Pour indiquer qu’un champ n’est pas obligatoire, passez required=False au constructeur de Field:

Python console
>>> f = forms.CharField(required=False)
>>> f.clean("foo")
'foo'
>>> f.clean("")
''
>>> f.clean(None)
''
>>> f.clean(0)
'0'
>>> f.clean(True)
'True'
>>> f.clean(False)
'False'

Lorsque required=False est défini pour un champ Field et que vous fournissez une valeur vide à clean(), la valeur renvoyée est une valeur vide normalisée et aucune exception ValidationError n’est générée. Pour CharField, la valeur renvoyée correspond à empty_value qui est une chaîne vide par défaut. Pour les autres classes Field, il peut s’agir de None (cela varie en fonction du champ).

Les composants des champs de formulaire obligatoires possèdent l’attribut HTML required. Il est possible de désactiver cela en définissant l’attribut Form.use_required_attribute à False. L’attribut required n’est pas ajouté aux formulaires groupés car la validation des navigateurs n’est pas toujours correcte quand on ajoute ou qu’on supprime de tels formulaires.

labelLien vers cette rubrique

Field.labelLien vers cette définition

Le paramètre label permet d’indiquer une étiquette conviviale pour le champ. Cette valeur est utilisée lorsque le champ Field est affiché dans un formulaire Form.

Comme expliqué dans « Affichage des formulaires en HTML » ci-dessus, l’étiquette par défaut d’un champ Field est générée à partir du nom de champ en convertissant tous les soulignements en espaces et en mettant en majuscule la première lettre. Donnez une valeur à label si ce comportement par défaut ne produit pas un résultat convenable.

Voici un exemple complet de formulaire implémentant label pour deux de ses champs. Nous avons indiqué auto_id=False pour simplifier l’affichage :

Python console
>>> from django import forms
>>> class CommentForm(forms.Form):
...     name = forms.CharField(label="Your name")
...     url = forms.URLField(label="Your website", required=False)
...     comment = forms.CharField()
...
>>> f = CommentForm(auto_id=False)
>>> print(f)
<div>Your name:<input type="text" name="name" required></div>
<div>Your website:<input type="url" name="url"></div>
<div>Comment:<input type="text" name="comment" required></div>

label_suffixLien vers cette rubrique

Field.label_suffixLien vers cette définition

Le paramètre label_suffix permet de surcharger l’attribut label_suffix d’un formulaire pour un champ particulier :

Python console
>>> class ContactForm(forms.Form):
...     age = forms.IntegerField()
...     nationality = forms.CharField()
...     captcha_answer = forms.IntegerField(label="2 + 2", label_suffix=" =")
...
>>> f = ContactForm(label_suffix="?")
>>> print(f)
<div><label for="id_age">Age?</label><input type="number" name="age" required id="id_age"></div>
<div><label for="id_nationality">Nationality?</label><input type="text" name="nationality" required id="id_nationality"></div>
<div><label for="id_captcha_answer">2 + 2 =</label><input type="number" name="captcha_answer" required id="id_captcha_answer"></div>

initialLien vers cette rubrique

Field.initialLien vers cette définition

Le paramètre initial permet d’indiquer la valeur initiale à utiliser lors de l’affichage HTML du champ dans un formulaire Form non lié.

Pour indiquer des données initiales dynamiques, voir le paramètre Form.initial.

Le cas d’utilisation typique est lorsque l’on veut afficher un formulaire vierge dans lequel un champ contient initialement une valeur. Par exemple :

Python console
>>> from django import forms
>>> class CommentForm(forms.Form):
...     name = forms.CharField(initial="Your name")
...     url = forms.URLField(initial="http://")
...     comment = forms.CharField()
...
>>> f = CommentForm(auto_id=False)
>>> print(f)
<div>Name:<input type="text" name="name" value="Your name" required></div>
<div>Url:<input type="url" name="url" value="http://" required></div>
<div>Comment:<input type="text" name="comment" required></div>

Vous vous demandez peut-être pourquoi on ne passe pas simplement un dictionnaire de valeurs initiales dans le paramètre data au moment d’afficher le formulaire ? Le problème de cette solution est que cela provoque la validation des données et que le résultat HTML contiendra alors d’éventuelles erreurs de validation :

Python console
>>> class CommentForm(forms.Form):
...     name = forms.CharField()
...     url = forms.URLField()
...     comment = forms.CharField()
...
>>> default_data = {"name": "Your name", "url": "http://"}
>>> f = CommentForm(default_data, auto_id=False)
>>> print(f)
<div>Name:
  <input type="text" name="name" value="Your name" required>
</div>
<div>Url:
  <ul class="errorlist"><li>Enter a valid URL.</li></ul>
  <input type="url" name="url" value="http://" required aria-invalid="true">
</div>
<div>Comment:
  <ul class="errorlist"><li>This field is required.</li></ul>
  <input type="text" name="comment" required aria-invalid="true">
</div>

C’est pourquoi les valeurs initiales ne sont affichées que pour les formulaires non liés. Pour les formulaires liés, le résultat HTML utilise les données liées.

Notez également que les valeurs initiales ne sont pas utilisées comme données de repli dans la validation lorsqu’une valeur de champ est manquante. Les valeurs initiales sont uniquement destinées à l’affichage initial d’un formulaire :

Python console
>>> class CommentForm(forms.Form):
...     name = forms.CharField(initial="Your name")
...     url = forms.URLField(initial="http://")
...     comment = forms.CharField()
...
>>> data = {"name": "", "url": "", "comment": "Foo"}
>>> f = CommentForm(data)
>>> f.is_valid()
False
# The form does *not* fall back to using the initial values.
>>> f.errors
{'url': ['This field is required.'], 'name': ['This field is required.']}

Au lieu d’une constante, il est aussi possible de transmettre un objet exécutable :

Python console
>>> import datetime
>>> class DateForm(forms.Form):
...     day = forms.DateField(initial=datetime.date.today)
...
>>> print(DateForm())
<div><label for="id_day">Day:</label><input type="text" name="day" value="2023-02-11" required id="id_day"></div>

L’objet exécutable ne sera évalué qu’au moment où le formulaire non lié est affiché, et non pas au moment de sa définition.

widgetLien vers cette rubrique

Field.widgetLien vers cette définition

Le paramètre widget permet d’indiquer une classe Widget à utiliser lors du rendu HTML de ce champ. Voir Composants de formulaires (« widgets ») pour plus d’informations.

help_textLien vers cette rubrique

Field.help_textLien vers cette définition

Le paramètre help_text vous permet de définir du texte descriptif pour ce champ. S’il est défini, il sera affiché près du champ lorsque celui-ci sera affiché en HTML par l’une des méthodes de raccourci de Form (par ex. as_ul()).

Tout comme l’attribut help_text d’un champ de modèle, cette valeur n’est pas sujette à l’échappement HTML dans les formulaires générés automatiquement.

Voici un exemple complet de formulaire implémentant help_text pour deux de ses champs. Nous avons indiqué auto_id=False pour simplifier l’affichage :

Python console
>>> from django import forms
>>> class HelpTextContactForm(forms.Form):
...     subject = forms.CharField(max_length=100, help_text="100 characters max.")
...     message = forms.CharField()
...     sender = forms.EmailField(help_text="A valid email address, please.")
...     cc_myself = forms.BooleanField(required=False)
...
>>> f = HelpTextContactForm(auto_id=False)
>>> print(f)
<div>Subject:<div class="helptext">100 characters max.</div><input type="text" name="subject" maxlength="100" required></div>
<div>Message:<input type="text" name="message" required></div>
<div>Sender:<div class="helptext">A valid email address, please.</div><input type="email" name="sender" required></div>
<div>Cc myself:<input type="checkbox" name="cc_myself"></div>

Lorsqu’un champ contient du texte d’aide et que le composant n’est pas produit dans un <fieldset>, aria-describedby est ajouté à la balise <input> afin de l’associer au texte d’aide :

Python console
>>> from django import forms
>>> class UserForm(forms.Form):
...     username = forms.CharField(max_length=255, help_text="e.g., user@example.com")
...
>>> f = UserForm()
>>> print(f)
<div>
<label for="id_username">Username:</label>
<div class="helptext" id="id_username_helptext">e.g., user@example.com</div>
<input type="text" name="username" maxlength="255" required aria-describedby="id_username_helptext" id="id_username">
</div>

Lors de l’ajout d’un attribut aria-describedby personnalisé, prenez soin d’inclure également l’identifiant id de l’élément help_text (si utilisé) dans l’ordre souhaité. Pour les lecteurs d’écran, les descriptions seront lues dans leur ordre d’apparition dans aria-describedby:

Python console
>>> class UserForm(forms.Form):
...     username = forms.CharField(
...         max_length=255,
...         help_text="e.g., user@example.com",
...         widget=forms.TextInput(
...             attrs={"aria-describedby": "custom-description id_username_helptext"},
...         ),
...     )
...
>>> f = UserForm()
>>> print(f["username"])
<input type="text" name="username" aria-describedby="custom-description id_username_helptext" maxlength="255" id="id_username" required>

error_messagesLien vers cette rubrique

Field.error_messagesLien vers cette définition

Le paramètre error_messages permet de redéfinir les messages par défaut que le champ renvoie. Passez un dictionnaire dont les clés correspondent aux messages d’erreur que vous voulez redéfinir. Par exemple, voici le message d’erreur par défaut :

Python console
>>> from django import forms
>>> generic = forms.CharField()
>>> generic.clean("")
Traceback (most recent call last):
  ...
ValidationError: ['This field is required.']

Et voici un message d’erreur personnalisé :

Python console
>>> name = forms.CharField(error_messages={"required": "Please enter your name"})
>>> name.clean("")
Traceback (most recent call last):
  ...
ValidationError: ['Please enter your name']

Dans la section Classes de champs Field intégrées ci-dessous, chaque champ Field définit les clés de messages d’erreur qu’il utilise.

validatorsLien vers cette rubrique

Field.validatorsLien vers cette définition

Le paramètre validators permet de définir une liste de fonctions de validation pour le champ.

Consultez la documentation des validateurs pour plus d’informations.

localizeLien vers cette rubrique

Field.localizeLien vers cette définition

Le paramètre localize active la régionalisation des données de formulaires, aussi bien au niveau de la saisie que de l’affichage produit.

Consultez la documentation sur la régionalisation de la mise en forme pour plus d’informations.

disabledLien vers cette rubrique

Field.disabledLien vers cette définition

Le paramètre booléen disabled, lorsqu’il est défini à True, désactive un champ de formulaire en utilisant l’attribut HTML disabled afin qu’il ne soit pas modifiable par les utilisateurs. Même si quelqu’un forçait la modification de la valeur du champ soumis au serveur, elle serait ignorée en faveur de la valeur fournie initialement au formulaire.

template_nameLien vers cette rubrique

Field.template_nameLien vers cette définition

L’argument template_name permet d’utiliser un gabarit personnalisé lorsque le champ est produit avec as_field_group(). Par défaut, cette valeur est "django/forms/field.html". Elle peut être adaptée pour chaque champ en surchargeant cet attribut ou plus généralement en surchargeant le gabarit par défaut, voir aussi Redéfinition des gabarits de champs intégrés.

Contrôle des données de champ modifiéesLien vers cette rubrique

has_changed()Lien vers cette rubrique

Field.has_changed()Lien vers cette définition

La méthode has_changed() est utilisée pour déterminer si la valeur du champ a été modifiée par rapport à sa valeur initiale. Renvoie True ou False.

Consultez la documentation de Form.has_changed() pour plus de détails.

Classes de champs Field intégréesLien vers cette rubrique

Bien évidemment, la bibliothèque des formulaires est livrée avec une série de classes Field représentant les besoins de validation les plus courants. Cette section décrit chaque champ intégré dans Django.

Pour chaque champ, nous indiquons le composant utilisé par défaut quand widget n’est pas précisé. Nous indiquons également la valeur renvoyée lorsqu’une valeur vide est fournie (voir la section sur required ci-dessus pour comprendre ce que cela signifie).

BooleanFieldLien vers cette rubrique

class BooleanField(**kwargs)Lien vers cette définition
  • Composant par défaut : CheckboxInput

  • Valeur vide : False

  • Est normalisé en : une valeur Python True ou False.

  • Valide que la valeur est True (signifiant par exemple que la case à cocher est cochée) si required=True pour ce champ.

  • Clés de messages d’erreur : required

CharFieldLien vers cette rubrique

class CharField(**kwargs)Lien vers cette définition
  • Composant par défaut : TextInput

  • Valeur vide : ce qui a été indiqué dans empty_value.

  • Est normalisé en : une chaîne.

  • Utilise MaxLengthValidator et MinLengthValidator si max_length et min_length sont fournis. Sinon, toutes les entrées sont valides.

  • Clés de messages d’erreur : required, max_length, min_length

Possède les paramètres facultatifs suivants liés à la validation :

max_lengthLien vers cette définition
min_lengthLien vers cette définition

Quand ils sont fournis, ces paramètres garantissent que la chaîne de caractères correspond au maximum ou au minimum à la longueur donnée.

stripLien vers cette définition

Si True (valeur par défaut), la valeur sera épurée d’éventuelles espaces initiales ou finales.

empty_valueLien vers cette définition

La valeur à utiliser pour représenter une valeur vide. Contient une chaîne vide par défaut.

ChoiceFieldLien vers cette rubrique

class ChoiceField(**kwargs)Lien vers cette définition
  • Composant par défaut : Select

  • Valeur vide : '' (une chaîne vide)

  • Est normalisé en : une chaîne.

  • Valide que la valeur donnée existe dans la liste à choix.

  • Clés de messages d’erreur : required, invalid_choice

Le message d’erreur invalid_choice peut contenir %(value)s, qui sera remplacé par le choix sélectionné.

Accepte un paramètre supplémentaire :

choicesLien vers cette définition

Soit un object itérable de tuples à 2 valeurs à utiliser comme liste de choix pour ce champ, soit un type énumération, soit un objet exécutable qui renvoie un tel objet itérable. Ce paramètre accepte les mêmes formats que le paramètre choices d’un champ de modèle. Consultez la documentation des champs de modèles sur les choix pour plus de détails. Si le paramètre est un exécutable, il est évalué lors de chaque initialisation du formulaire contenant le champ, en plus de l’évaluation au moment du rendu. Par défaut, c’est une liste vide.

DateFieldLien vers cette rubrique

class DateField(**kwargs)Lien vers cette définition
  • Composant par défaut : DateInput

  • Valeur vide : None

  • Est normalisé en : un objet Python datetime.date.

  • Valide que la valeur donnée est un objet datetime.date, datetime.datetime ou une chaîne mise en forme dans un format de date particulier.

  • Clés de messages d’erreur : required, invalid

Accepte un paramètre facultatif :

input_formatsLien vers cette définition

Un objet itérable de chaînes de format utilisées pour essayer de convertir une chaîne en un objet datetime.date valide.

Si aucun paramètre input_formats n’est indiqué, les formats d’entrée par défaut sont lus dans la clé DATE_INPUT_FORMATS du format de langue actif, ou dans le réglage DATE_INPUT_FORMATS si la régionalisation est désactivée. Voir aussi la régionalisation des formats.

DateTimeFieldLien vers cette rubrique

class DateTimeField(**kwargs)Lien vers cette définition
  • Composant par défaut : DateTimeInput

  • Valeur vide : None

  • Est normalisé en : un objet Python datetime.datetime.

  • Valide que la valeur donnée est un objet datetime.datetime, datetime.date ou une chaîne mise en forme dans un format de date/heure particulier.

  • Clés de messages d’erreur : required, invalid

Accepte un paramètre facultatif :

input_formatsLien vers cette définition

Un objet itérable de chaînes de format utilisées pour essayer de convertir une chaîne en un objet datetime.datetime valide, en plus des formats ISO 8601.

Le champ accepte toujours les chaînes mises en forme selon le format ISO 8601 ou apparenté reconnues par parse_datetime(). Voici quelques exemples :

  • '2006-10-25 14:30:59'

  • '2006-10-25T14:30:59'

  • '2006-10-25 14:30'

  • '2006-10-25T14:30'

  • '2006-10-25T14:30Z'

  • '2006-10-25T14:30+02:00'

  • '2006-10-25'

Si aucun paramètre input_formats n’est indiqué, les formats d’entrée par défaut sont lus dans les clés DATETIME_INPUT_FORMATS et DATE_INPUT_FORMATS du format de langue actif, ou dans les réglages DATETIME_INPUT_FORMATS et DATE_INPUT_FORMATS si la régionalisation est désactivée. Voir aussi la régionalisation des formats.

DecimalFieldLien vers cette rubrique

class DecimalField(**kwargs)Lien vers cette définition
  • Composant par défaut : NumberInput lorsque Field.localize vaut False, sinon TextInput.

  • Valeur vide : None

  • Est normalisé en : un objet Python decimal.

  • Valide que la valeur donnée est un nombre décimal. Utilise MaxValueValidator et MinValueValidator si max_value et min_value sont fournis. Utilise StepValueValidator si step_size est fourni. Les espaces de début et de fin sont ignorés.

  • Clés de messages d’erreur : required, invalid, max_value, min_value, max_digits, max_decimal_places, max_whole_digits, step_size.

Les messages d’erreur max_value et min_value peuvent contenir %(limit_value)s, qui sera remplacé par la limite concernée. Sur le même principe, les messages d’erreur max_digits, max_decimal_places et max_whole_digits peuvent contenir %(max)s.

Accepte cinq paramètres facultatifs :

max_valueLien vers cette définition
min_valueLien vers cette définition

Ces paramètres contrôlent les intervalles de valeurs autorisées dans le champ et doivent être exprimés en valeurs decimal.Decimal.

max_digitsLien vers cette définition

Le nombre maximum de chiffres autorisés dans la valeur (avant et après le point décimal, sans tenir compte des zéros initiaux).

decimal_placesLien vers cette définition

Le nombre maximal de décimales autorisées.

step_sizeLien vers cette définition

Limite la validité des entrées à un multiple entier de step_size. Si min_value est aussi indiquée, elle est ajoutée comme valeur de décalage pour déterminer si la taille de pas correspond.

DurationFieldLien vers cette rubrique

class DurationField(**kwargs)Lien vers cette définition
  • Composant par défaut : TextInput

  • Valeur vide : None

  • Est normalisé en : un objet Python timedelta.

  • Valide que la valeur donnée est une chaîne qui peut être convertie en une différence de temps timedelta. La valeur doit être comprise entre datetime.timedelta.min et datetime.timedelta.max.

  • Clés de messages d’erreur : required, invalid, overflow.

Accepte tout format que parse_duration() peut analyser.

EmailFieldLien vers cette rubrique

class EmailField(**kwargs)Lien vers cette définition
  • Composant par défaut : EmailInput

  • Valeur vide : ce qui a été indiqué dans empty_value.

  • Est normalisé en : une chaîne.

  • Utilise EmailValidator pour valider que la valeur donnée est une adresse de courriel valide, en utilisant une expression régulière moyennement complexe.

  • Clés de messages d’erreur : required, invalid

Possède les paramètres facultatifs max_length, min_length et empty_value, qui fonctionnent exactement comme pour CharField. Le paramètre max_length contient par défaut 320 (voir RFC 3696 Section 3).

FileFieldLien vers cette rubrique

class FileField(**kwargs)Lien vers cette définition
  • Composant par défaut : ClearableFileInput

  • Valeur vide : None

  • Est normalisé en : un objet UploadedFile englobant le contenu du fichier et son nom dans un seul objet.

  • Peut valider que des données de fichier non vides ont été fournies au formulaire.

  • Clés de messages d’erreur : required, invalid, missing, empty, max_length

Accepte les paramètres facultatifs pour la validation, max_length et allow_empty_file. S’ils sont présents, ils garantissent respectivement que la longueur du nom de fichier ne dépasse pas la longueur indiquée et que la validation passe même quand le contenu du fichier est vide.

Pour en savoir plus au sujet de l’objet UploadedFile, consultez la documentation sur les envois de fichiers.

Lorsque vous utilisez un champ FileField dans un formulaire, vous ne devez pas oublier de lier les données de fichier au formulaire.

L’erreur max_length porte sur la longueur du nom de fichier. Dans le message d’erreur de cette clé, %(max)d sera remplacé par la longueur maximale du nom de fichier et %(length)d sera remplacé par la longueur effective du nom de fichier.

FilePathFieldLien vers cette rubrique

class FilePathField(**kwargs)Lien vers cette définition
  • Composant par défaut : Select

  • Valeur vide : '' (une chaîne vide)

  • Est normalisé en : une chaîne.

  • Valide que le choix sélectionné existe dans la liste à choix.

  • Clés de messages d’erreur : required, invalid_choice

Ce champ permet de choisir parmi des fichiers dans un répertoire désigné. Il accepte cinq paramètres supplémentaires ; seul path est obligatoire :

pathLien vers cette définition

Le chemin absolu vers le répertoire dont le contenu doit être présent dans la liste. Ce répertoire doit exister.

recursiveLien vers cette définition

Si False (valeur par défaut), seul le contenu au premier niveau de path sera à disposition dans les choix possibles. Si True, le répertoire sera parcouru récursivement et tous ses descendants seront inclus dans les choix possibles.

matchLien vers cette définition

Un motif d’expression régulière ; seuls les fichiers dont les noms correspondent à cette expression seront disponibles dans la liste à choix.

allow_filesLien vers cette définition

Facultatif. Vaut True ou False. La valeur par défaut est True. Indique si les fichiers de l’emplacement spécifié doivent être inclus. Il faut que l’une des deux valeurs, ce champ ou allow_folders, soit True.

allow_foldersLien vers cette définition

Facultatif. Vaut True ou False. La valeur par défaut est False. Indique si tous les répertoires à l’intérieur de l’emplacement spécifié doivent être inclus. Il faut que l’une des deux valeurs, ce champ ou allow_files, soit True.

FloatFieldLien vers cette rubrique

class FloatField(**kwargs)Lien vers cette définition
  • Composant par défaut : NumberInput lorsque Field.localize vaut False, sinon TextInput.

  • Valeur vide : None

  • Est normalisé en : un objet Python float.

  • Valide que la valeur donnée est un nombre à virgule (float). Utilise MaxValueValidator et MinValueValidator si max_value et min_value sont fournis. Utilise StepValueValidator si step_size est fourni. Les espaces de début et de fin sont permis, comme pour la fonction float() de Python.

  • Clés de messages d’erreur : required, invalid, max_value, min_value, step_size.

Accepte trois paramètres facultatifs :

max_valueLien vers cette définition
min_valueLien vers cette définition

Ces paramètres contrôlent l’intervalle des valeurs autorisées dans ce champ.

step_sizeLien vers cette définition

Limite la validité des entrées à un multiple entier de step_size. Si min_value est aussi indiquée, elle est ajoutée comme valeur de décalage pour déterminer si la taille de pas correspond.

GenericIPAddressFieldLien vers cette rubrique

class GenericIPAddressField(**kwargs)Lien vers cette définition

Un champ contenant soit une adresse IPv4, soit une adresse IPv6.

  • Composant par défaut : TextInput

  • Valeur vide : '' (une chaîne vide)

  • Est normalisé en : une chaîne. Les adresses IPv6 sont normalisées selon la description ci-dessous.

  • Valide que la valeur donnée est une adresse IP valide.

  • Error message keys: required, invalid, max_length

La normalisation d’adresse IPv6 respecte la section 2.2 de la RFC 4291 Section 2.2, y compris l’utilisation du format IPv4 suggéré dans le 3e paragraphe de cette section, comme ::ffff:192.0.2.0. Par exemple, 2001:0::0:01 sera normalisé en 2001::1 et ::ffff:0a0a:0a0a en ::ffff:10.10.10.10. Tous les caractères sont convertis en minuscules.

Accepte trois paramètres facultatifs :

protocolLien vers cette définition

Limite la validité des saisies au protocole indiqué. Les valeurs possibles sont 'both' (les deux protocoles acceptés, valeur par défaut), 'IPv4' ou 'IPv6'. La correspondance n’est pas sensible à la casse.

unpack_ipv4Lien vers cette définition

Décode les adresses IPv4 mappées comme ::ffff:192.0.2.1. Si cette option est activée, cette adresse serait décodée en 192.0.2.1. L’option est désactivée par défaut. Utilisable uniquement quand protocol est défini à 'both'.

max_lengthLien vers cette définition

Defaults to 39, and behaves the same way as it does for CharField.

ImageFieldLien vers cette rubrique

class ImageField(**kwargs)Lien vers cette définition
  • Composant par défaut : ClearableFileInput

  • Valeur vide : None

  • Est normalisé en : un objet UploadedFile englobant le contenu du fichier et son nom dans un seul objet.

  • Valide que les données de fichier ont été liées au formulaire. Utilise aussi FileExtensionValidator pour valider que l’extension de fichier est prise en charge par Pillow.

  • Clés de messages d’erreur : required, invalid, missing, empty, invalid_image

L’emploi de ImageField requiert que Pillow soit installé et gère les formats d’image que vous utilisez. Si vous obtenez une erreur d’image corrompue (corrupt image) lorsque vous téléversez une image, cela signifie généralement que Pillow ne prend pas en charge son format. Pour corriger cela, installez la bibliothèque correspondante et réinstallez Pillow.

Lorsque vous utilisez un champ ImageField dans un formulaire, vous ne devez pas oublier de lier les données de fichier au formulaire.

Après que le champ a été nettoyé et validé, l’objet UploadedFile comportera un attribut supplémentaire image contenant l’instance Image de Pillow utilisée pour contrôler que le fichier est une image valide. Pillow ferme le descripteur de fichier sous-jacent après avoir vérifié l’image ; ainsi, alors que certains attributs de données non image tels que format, height et width sont accessibles, ce n’est pas le cas des méthodes qui accèdent aux données image sous-jacentes, telles que getdata() ou getpixel(), sauf si vous prenez la peine de réouvrir le fichier. Par exemple :

Python console
>>> from PIL import Image
>>> from django import forms
>>> from django.core.files.uploadedfile import SimpleUploadedFile
>>> class ImageForm(forms.Form):
...     img = forms.ImageField()
...
>>> file_data = {"img": SimpleUploadedFile("test.png", b"file data")}
>>> form = ImageForm({}, file_data)
# Pillow closes the underlying file descriptor.
>>> form.is_valid()
True
>>> image_field = form.cleaned_data["img"]
>>> image_field.image
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=191x287 at 0x7F5985045C18>
>>> image_field.image.width
191
>>> image_field.image.height
287
>>> image_field.image.format
'PNG'
>>> image_field.image.getdata()
# Raises AttributeError: 'NoneType' object has no attribute 'seek'.
>>> image = Image.open(image_field)
>>> image.getdata()
<ImagingCore object at 0x7f5984f874b0>

De plus, UploadedFile.content_type sera également mis à jour avec le type de contenu de l’image pour autant que Pillow puisse le déterminer, sinon il prend la valeur None.

IntegerFieldLien vers cette rubrique

class IntegerField(**kwargs)Lien vers cette définition
  • Composant par défaut : NumberInput lorsque Field.localize vaut False, sinon TextInput.

  • Valeur vide : None

  • Est normalisé en : un nombre entier Python.

  • Valide que la valeur donnée est un nombre entier. Utilise MaxValueValidator et MinValueValidator si max_value et min_value sont fournis. Utilise StepValueValidator si step_size est fourni. Les espaces de début et de fin sont permis, comme pour la fonction int() de Python.

  • Clés de messages d’erreur : required, invalid, max_value, min_value, step_size

Les messages d’erreur max_value, min_value et step_size peuvent contenir %(limit_value)s, qui sera remplacé par la limite concernée.

Accepte trois paramètres facultatifs liés à la validation :

max_valueLien vers cette définition
min_valueLien vers cette définition

Ces paramètres contrôlent l’intervalle des valeurs autorisées dans ce champ.

step_sizeLien vers cette définition

Limite la validité des entrées à un multiple entier de step_size. Si min_value est aussi indiquée, elle est ajoutée comme valeur de décalage pour déterminer si la taille de pas correspond.

JSONFieldLien vers cette rubrique

class JSONField(encoder=None, decoder=None, **kwargs)Lien vers cette définition

Un champ qui accepte des données codées en JSON pour un champ JSONField.

  • Composant par défaut : Textarea

  • Valeur vide : None

  • Est normalisé en : une représentation Python de la valeur JSON (habituellement une valeur dict, list ou None), en fonction de JSONField.decoder.

  • Valide que la valeur donnée est une structure JSON valide.

  • Clés de messages d’erreur : required, invalid

Accepte deux paramètres facultatifs :

encoderLien vers cette définition

Une sous-classe de py:class:json.JSONEncoder pour sérialiser les types de données non prises en charge par le sérialiseur JSON standard (par ex. datetime.datetime ou UUID). Par exemple, vous pouvez utiliser la classe DjangoJSONEncoder.

Contient json.JSONEncoder par défaut.

decoderLien vers cette définition

Une sous-classe de json.JSONDecoder pour désérialiser l’entrée. La désérialisation pourrait devoir tenir compte de l’incertitude liée au type de la valeur d’entrée. Par exemple, vous courez le risque de renvoyer un objet datetime qui était en fait une chaîne qui était fortuitement au même format que celui choisi pour les objets datetime.

Le decoder peut être utiliser pour valider les données entrées. Si json.JSONDecodeError est générée durant la désérialisation, une exception ValidationError sera produite.

Contient json.JSONDecoder par défaut.

MultipleChoiceFieldLien vers cette rubrique

class MultipleChoiceField(**kwargs)Lien vers cette définition
  • Composant par défaut : SelectMultiple

  • Valeur vide : [] (une liste vide)

  • Est normalisé en : une liste de chaînes.

  • Valide que chaque valeur dans la liste donnée existe dans la liste à choix.

  • Clés de messages d’erreur : required, invalid_choice, invalid_list

Le message d’erreur invalid_choice peut contenir %(value)s, qui sera remplacé par le choix sélectionné.

Requiert un paramètre supplémentaire obligatoire, choices, comme pour ChoiceField.

NullBooleanFieldLien vers cette rubrique

class NullBooleanField(**kwargs)Lien vers cette définition
  • Composant par défaut : NullBooleanSelect

  • Valeur vide : None

  • Est normalisé en : une valeur Python True, False ou None.

  • Ne valide rien (c’est-à-dire qu’il n’y a jamais d’exception ValidationError).

NullBooleanField peut être utilisé avec des composants tels que Select ou RadioSelect en indiquant les choix choices du composant

Code
NullBooleanField(
    widget=Select(
        choices=[
            ("", "Unknown"),
            (True, "Yes"),
            (False, "No"),
        ]
    )
)

RegexFieldLien vers cette rubrique

class RegexField(**kwargs)Lien vers cette définition
  • Composant par défaut : TextInput

  • Valeur vide : ce qui a été indiqué dans empty_value.

  • Est normalisé en : une chaîne.

  • Utilise RegexValidator pour valider que la valeur donnée correspond à une certaine expression régulière.

  • Clés de messages d’erreur : required, invalid

Requiert un paramètre supplémentaire obligatoire :

regexLien vers cette définition

Une expression régulière exprimée sous forme de chaîne ou d’objet expression régulière compilée.

Accepte également max_length, min_length, strip et empty_value, qui fonctionnent exactement comme pour CharField.

stripLien vers cette définition

Contient False par défaut. Quand ce paramètre est activé, l’épuration des espaces initiales et finales s’effectue avant la validation par l’expression régulière.

SlugFieldLien vers cette rubrique

class SlugField(**kwargs)Lien vers cette définition
  • Composant par défaut : TextInput

  • Valeur vide : ce qui a été indiqué dans empty_value.

  • Est normalisé en : une chaîne.

  • Utilise validate_slug ou validate_unicode_slug pour valider que la valeur donnée ne contient que des lettres, des nombres, des soulignements et des tirets.

  • Clés de messages d’erreur : required, invalid

Ce champ est prévu pour l’affichage des champs de modèle SlugField dans les formulaires.

Accepte deux paramètres facultatifs :

allow_unicodeLien vers cette définition

Une valeur booléenne indiquant au champ d’accepter des lettres Unicode en plus des lettres ASCII de base. La valeur par défaut est False.

empty_valueLien vers cette définition

La valeur à utiliser pour représenter une valeur vide. Contient une chaîne vide par défaut.

TimeFieldLien vers cette rubrique

class TimeField(**kwargs)Lien vers cette définition
  • Composant par défaut : TimeInput

  • Valeur vide : None

  • Est normalisé en : un objet Python datetime.time.

  • Valide que la valeur donnée est un objet datetime.time ou une chaîne mise en forme dans un format d’heure particulier.

  • Clés de messages d’erreur : required, invalid

Accepte un paramètre facultatif :

input_formatsLien vers cette définition

Un objet itérable de chaînes de format utilisées pour essayer de convertir une chaîne en un objet datetime.time valide.

Si aucun paramètre input_formats n’est indiqué, les formats d’entrée par défaut sont lus dans la clé TIME_INPUT_FORMATS du format de langue actif, ou dans le réglage TIME_INPUT_FORMATS si la régionalisation est désactivée. Voir aussi la régionalisation des formats.

TypedChoiceFieldLien vers cette rubrique

class TypedChoiceField(**kwargs)Lien vers cette définition

Similaire à ChoiceField, sauf que TypedChoiceField accepte deux paramètres supplémentaires, coerce et empty_value.

  • Composant par défaut : Select

  • Valeur vide : ce qui a été indiqué dans empty_value.

  • Est normalisé en : une valeur du type indiqué par le paramètre coerce.

  • Valide que la valeur donnée existe dans la liste à choix et qu’elle peut être transformée dans le bon type.

  • Clés de messages d’erreur : required, invalid_choice

Accepte des paramètres supplémentaires :

coerceLien vers cette définition

Une fonction acceptant un paramètre et renvoyant une valeur transtypée. Comme exemple, on peut mentionner les fonctions Python int, float, bool et les autres types. Par défaut, il s’agit de la fonction identité. Notez que le forçage de type se produit après la validation de saisie, il est donc possible de forcer une valeur qui n’est pas présente dans choices.

empty_valueLien vers cette définition

La valeur utilisée pour signifier « vide ». Par défaut, il s’agit de la chaîne vide ; None est une autre option assez fréquente ici. Remarquez que le type de cette valeur ne sera pas transformé par le contenu du paramètre coerce, il faut donc la choisir en conséquence.

TypedMultipleChoiceFieldLien vers cette rubrique

class TypedMultipleChoiceField(**kwargs)Lien vers cette définition

Similaire à MultipleChoiceField, sauf que TypedMultipleChoiceField accepte deux paramètres supplémentaires, coerce et empty_value.

  • Composant par défaut : SelectMultiple

  • Valeur vide : ce qui a été indiqué dans empty_value

  • Est normalisé en : une liste de valeurs du type indiqué par le paramètre coerce.

  • Valide que les valeurs données existent dans la liste à choix et qu’elles peuvent être transformées dans le bon type.

  • Clés de messages d’erreur : required, invalid_choice

Le message d’erreur invalid_choice peut contenir %(value)s, qui sera remplacé par le choix sélectionné.

Accepte deux paramètres supplémentaires, coerce et empty_value, comme pour TypedChoiceField.

URLFieldLien vers cette rubrique

class URLField(**kwargs)Lien vers cette définition
  • Composant par défaut : URLInput

  • Valeur vide : ce qui a été indiqué dans empty_value.

  • Est normalisé en : une chaîne.

  • Utilise URLValidator pour valider que la valeur donnée est une URL valide.

  • Clés de messages d’erreur : required, invalid

Possède les paramètres facultatifs max_length, min_length et empty_value, qui fonctionnent exactement comme pour CharField, ainsi qu’un argument supplémentaire :

assume_schemeLien vers cette définition

Le protocole supposé des URL qui n’en contiennent pas. Vaut "http" par défaut. Par exemple, si assume_scheme vaut "https" et que la valeur fournie est "exemple.com", la valeur normalisée sera "https://exemple.com".

UUIDFieldLien vers cette rubrique

class UUIDField(**kwargs)Lien vers cette définition
  • Composant par défaut : TextInput

  • Valeur vide : None

  • Est normalisé en : un objet UUID.

  • Clés de messages d’erreur : required, invalid

Ce champ accepte toute chaîne dans un format accepté par le paramètre hex du constructeur UUID.

Classes de champs Field intégrées plus complexesLien vers cette rubrique

ComboFieldLien vers cette rubrique

class ComboField(**kwargs)Lien vers cette définition
  • Composant par défaut : TextInput

  • Valeur vide : '' (une chaîne vide)

  • Est normalisé en : une chaîne.

  • Valide que la valeur donnée est valide pour chacun des champs indiqués en paramètre de ComboField.

  • Clés de messages d’erreur : required, invalid

Requiert un paramètre supplémentaire obligatoire :

fieldsLien vers cette définition

La liste des champs devant être utilisés pour valider la valeur du champ (dans l’ordre de leur présentation).

Python console
>>> from django.forms import ComboField
>>> f = ComboField(fields=[CharField(max_length=20), EmailField()])
>>> f.clean("test@example.com")
'test@example.com'
>>> f.clean("longemailaddress@example.com")
Traceback (most recent call last):
...
ValidationError: ['Ensure this value has at most 20 characters (it has 28).']

MultiValueFieldLien vers cette rubrique

class MultiValueField(fields=(), **kwargs)Lien vers cette définition
  • Composant par défaut : TextInput

  • Valeur vide : '' (une chaîne vide)

  • Est normalisé en : le type renvoyé par la méthode compress de la sous-classe.

  • Valide que les valeurs données sont valides pour chacun des champs indiqués en paramètre de MultiValueField.

  • Clés de messages d’erreur : required, invalid, incomplete

Agrège la logique de plusieurs champs qui produisent une seule valeur en commun.

Ce champ est abstrait et doit être hérité. Au contraire des champs à valeur unique, les sous-classes de MultiValueField ne doivent pas implémenter clean() mais plutôt compress().

Requiert un paramètre supplémentaire obligatoire :

fieldsLien vers cette définition

Un tuple de champs dont les valeurs sont nettoyées puis ultérieurement combinées en une seule valeur. Chaque valeur du champ est nettoyée par le champ correspondant dans fields – la première valeur est nettoyée par le premier champ, la deuxième valeur par le deuxième champ, etc. Lorsque tous les champs ont été nettoyés, la liste de ces valeurs est combinée en une valeur unique par compress().

Accepte aussi des paramètre facultatifs :

require_all_fieldsLien vers cette définition

La valeur par défaut est True, auquel cas une erreur de validation required est générée si aucune valeur n’est fournie pour aucun champ.

Lorsque la valeur est False, l’attribut Field.required peut être défini à False pour des champs individuels pour les rendre facultatifs. Si aucune valeur n’est fournie pour un champ obligatoire, une erreur de validation incomplete est générée.

Un message d’erreur incomplete par défaut peut être défini dans la sous-classe de MultiValueField, ou il est possible de définir des messages différents pour chaque champ individuellement. Par exemple :

Code
from django.core.validators import RegexValidator


class PhoneField(MultiValueField):
    def __init__(self, **kwargs):
        # Define one message for all fields.
        error_messages = {
            "incomplete": "Enter a country calling code and a phone number.",
        }
        # Or define a different message for each field.
        fields = (
            CharField(
                error_messages={"incomplete": "Enter a country calling code."},
                validators=[
                    RegexValidator(r"^[0-9]+$", "Enter a valid country calling code."),
                ],
            ),
            CharField(
                error_messages={"incomplete": "Enter a phone number."},
                validators=[RegexValidator(r"^[0-9]+$", "Enter a valid phone number.")],
            ),
            CharField(
                validators=[RegexValidator(r"^[0-9]+$", "Enter a valid extension.")],
                required=False,
            ),
        )
        super().__init__(
            error_messages=error_messages,
            fields=fields,
            require_all_fields=False,
            **kwargs
        )
widgetLien vers cette définition

Doit être une sous-classe de django.forms.MultiWidget. La valeur par défaut est TextInput, qui n’est probablement pas très utile dans ce cas.

compress(data_list)Lien vers cette définition

Accepte une liste de valeurs valides et renvoie une version « compressée » de ces valeurs dans une seule valeur. Par exemple, SplitDateTimeField est une sous-classe qui combine un champ heure et un champ date en un seul objet datetime.

Cette méthode doit être implémentée par les sous-classes.

SplitDateTimeFieldLien vers cette rubrique

class SplitDateTimeField(**kwargs)Lien vers cette définition
  • Composant par défaut : SplitDateTimeWidget

  • Valeur vide : None

  • Est normalisé en : un objet Python datetime.datetime.

  • Valide que la valeur donnée est un objet datetime.datetime ou une chaîne mise en forme dans un format de date/heure particulier.

  • Clés de messages d’erreur : required, invalid, invalid_date, invalid_time

Accepte deux paramètres facultatifs :

input_date_formatsLien vers cette définition

Une liste de chaînes de format utilisées pour essayer de convertir une chaîne en un objet datetime.date valide.

Si aucun paramètre input_date_formats n’est indiqué, ce sont les formats de saisie par défaut de DateField qui sont utilisés.

input_time_formatsLien vers cette définition

Une liste de chaînes de format utilisées pour essayer de convertir une chaîne en un objet datetime.time valide.

Si aucun paramètre input_time_formats n’est indiqué, ce sont les formats de saisie par défaut de TimeField qui sont utilisés.

Champs dédiés aux relationsLien vers cette rubrique

Deux champs sont disponibles pour représenter les relations entre modèles : ModelChoiceField and ModelMultipleChoiceField. Ces deux champs exigent un seul paramètre queryset utilisé pour créer les choix du champ. Lors de la validation du formulaire, ces champs placent soit un objet de modèle (dans le cas de ModelChoiceField), soit plusieurs objets de modèle (dans le cas de ModelMultipleChoiceField) dans le dictionnaire cleaned_data du formulaire.

Pour des usages plus complexes, il est possible d’indiquer queryset=None au moment de déclarer le champ de formulaire, puis de remplir queryset dans la méthode __init__() du formulaire :

Code
class FooMultipleChoiceForm(forms.Form):
    foo_select = forms.ModelMultipleChoiceField(queryset=None)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["foo_select"].queryset = ...

ModelChoiceField et ModelMultipleChoiceField ont les deux un attribut iterator qui spécifie la classe utilisée pour itérer sur le jeu de requête lors de la génération des choix. Voir Itération sur les choix relationnels pour plus de détails.

ModelChoiceFieldLien vers cette rubrique

class ModelChoiceField(**kwargs)Lien vers cette définition
  • Composant par défaut : Select

  • Valeur vide : None

  • Est normalisé en : une instance de modèle.

  • Valide que l’identifiant donné existe dans le jeu de requête.

  • Clés de messages d’erreur : required, invalid_choice

Le message d’erreur invalid_choice peut contenir %(value)s, qui sera remplacé par le choix sélectionné.

Permet de sélectionner un seul objet de modèle, adapté à la représentation d’une clé étrangère. Notez que le composant par défaut de ModelChoiceField devient difficilement utilisable au fur et à mesure que le nombre de choix possibles augmente. Il n’est pas recommandé de l’utiliser lorsque le nombre d’éléments à choix dépasse 100.

Un seul paramètre est obligatoire :

querysetLien vers cette définition

Un jeu de requête QuerySet d’objets de modèles constituant la source des choix possibles pour le champ et qui est utilisé aussi pour valider le choix de l’utilisateur. Il est évalué au moment du rendu du formulaire.

ModelChoiceField accepte aussi plusieurs paramètres facultatifs :

empty_labelLien vers cette définition

Par défaut, le composant <select> utilisé par ModelChoiceField comportera un choix vide en premier dans la liste. Vous pouvez adapter le texte de cette étiquette (qui est "---------" par défaut) au moyen de l’attribut empty_label, ou même désactiver complètement le choix vide en définissant empty_label à None:

Code
# A custom empty label
field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)")

# No empty label
field2 = forms.ModelChoiceField(queryset=..., empty_label=None)

Notez qu’aucun choix vide n’est créé (quelle que soit la valeur de empty_label) si un champ ModelChoiceField est obligatoire et possède une valeur initiale par défaut, ou que son composant widget est class:~django.forms.RadioSelect et que son argument blank est False.

to_field_nameLien vers cette définition

Ce paramètre facultatif est utilisé pour désigner le champ à utiliser comme valeur des choix dans le composant du champ. Contrôlez qu’il s’agit bien d’un champ unique du modèle, sinon la valeur sélectionnée pourrait correspondre à plus d’un objet. Par défaut ce paramètre vaut None, ce qui signifie que c’est la clé primaire de chaque objet qui est utilisée. Par exemple :

Code
# No custom to_field_name
field1 = forms.ModelChoiceField(queryset=...)

produirait :

Html
<select id="id_field1" name="field1">
<option value="obj1.pk">Object1</option>
<option value="obj2.pk">Object2</option>
...
</select>

et :

Code
# to_field_name provided
field2 = forms.ModelChoiceField(queryset=..., to_field_name="name")

produirait :

Html
<select id="id_field2" name="field2">
<option value="obj1.name">Object1</option>
<option value="obj2.name">Object2</option>
...
</select>
blankLien vers cette définition

Lors de l’utilisation du composant RadioSelect, cet argument booléen facultatif détermine si un choix vide est créé. Par défaut, blank vaut False, auquel cas aucun choix vide n’est créé.

ModelChoiceField possède également cet attribut :

iteratorLien vers cette définition

La classe d’itération utilisée pour générer les choix du champ à partir de queryset. Par défaut, ModelChoiceIterator.

La méthode __str__() du modèle sera appelée pour générer les représentations textuelles des objets à faire figurer dans les choix du champ. Pour fournir des représentations personnalisées, créez une sous-classe de ModelChoiceField et surchargez label_from_instance. Cette méthode reçoit un objet de modèle et doit renvoyer une chaîne représentative de l’objet. Par exemple :

Code
from django.forms import ModelChoiceField


class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "My Object #%i" % obj.id

ModelMultipleChoiceFieldLien vers cette rubrique

class ModelMultipleChoiceField(**kwargs)Lien vers cette définition
  • Composant par défaut : SelectMultiple

  • Valeur vide : un QuerySet vide (self.queryset.none())

  • Est normalisé en : un QuerySet d’instances de modèles.

  • Valide que chaque identifiant dans la liste donnée existe dans le jeu de requête.

  • Clés de messages d’erreur : required, invalid_list, invalid_choice, invalid_pk_value

Le message d’erreur invalid_choice peut contenir %(value)s et le message invalid_pk_value peut contenir %(pk)s, qui seront substitués par les valeurs appropriées.

Permet la sélection d’un ou de plusieurs objets de modèles, adapté à la représentation de relations plusieurs-à-plusieurs. Comme pour ModelChoiceField, vous pouvez utiliser label_from_instance afin de personnaliser les représentations des objets.

Un seul paramètre est obligatoire :

querysetLien vers cette définition

Identique à ModelChoiceField.queryset.

Accepte un paramètre facultatif :

to_field_nameLien vers cette définition

Identique à ModelChoiceField.to_field_name.

ModelMultipleChoiceField possède également cet attribut :

iteratorLien vers cette définition

Identique à ModelChoiceField.iterator.

Itération sur les choix relationnelsLien vers cette rubrique

Par défaut, ModelChoiceField et ModelMultipleChoiceField utilisent ModelChoiceIterator pour générer leur choix de champ choices.

Lors de son itération, ModelChoiceIterator produit des choix de tuples à 2 éléments contenant des instances ModelChoiceIteratorValue comme premier élément value dans chaque choix. ModelChoiceIteratorValue enveloppe la valeur du choix tout en maintenant une référence à l’instance de modèle source pouvant être utilisée par exemple dans des implémentations de composants personnalisés pour ajouter des attributs data-* aux éléments <option>.

Par exemple, considérons les modèles suivants :

Code
from django.db import models


class Topping(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(decimal_places=2, max_digits=6)

    def __str__(self):
        return self.name


class Pizza(models.Model):
    topping = models.ForeignKey(Topping, on_delete=models.CASCADE)

Vous pouvez utiliser une sous-classe de composant Select pour inclure la valeur de Topping.price sous forme d’attribut HTML data-price pour chaque élément <option>:

Code
from django import forms


class ToppingSelect(forms.Select):
    def create_option(
        self, name, value, label, selected, index, subindex=None, attrs=None
    ):
        option = super().create_option(
            name, value, label, selected, index, subindex, attrs
        )
        if value:
            option["attrs"]["data-price"] = value.instance.price
        return option


class PizzaForm(forms.ModelForm):
    class Meta:
        model = Pizza
        fields = ["topping"]
        widgets = {"topping": ToppingSelect}

Cela produira l’élément select pour Pizza.topping ainsi :

Html
<select id="id_topping" name="topping" required>
<option value="" selected>---------</option>
<option value="1" data-price="1.50">mushrooms</option>
<option value="2" data-price="1.25">onions</option>
<option value="3" data-price="1.75">peppers</option>
<option value="4" data-price="2.00">pineapple</option>
</select>

Pour des usages plus avancés, vous pouvez créer des sous-classes de ModelChoiceIterator afin de personnaliser les choix de tuples à 2 éléments qui sont produits.

ModelChoiceIteratorLien vers cette rubrique

class ModelChoiceIterator(field)Lien vers cette définition

La classes par défaut attribuée à l’attribut iterator des champs ModelChoiceField et ModelMultipleChoiceField. Un objet itérable produisant des choix de tuples à 2 éléments à partir du jeu de requête.

Un seul paramètre est obligatoire :

fieldLien vers cette définition

L’instance ModelChoiceField ou ModelMultipleChoiceField sur laquelle itérer et qui produira les choix.

ModelChoiceIterator possède la méthode suivante :

__iter__()Lien vers cette définition

Produit des choix de tuples à 2 éléments, au format (value, label) utilisé par ChoiceField.choices. Le premier élément value est une instance ModelChoiceIteratorValue.

ModelChoiceIteratorValueLien vers cette rubrique

class ModelChoiceIteratorValue(value, instance)Lien vers cette définition

Deux paramètres sont obligatoires :

valueLien vers cette définition

La valeur du choix. Cette valeur est utilisée pour produire l’attribut value d’un élément HTML <option>.

instanceLien vers cette définition

L’instance de modèle provenant du jeu de requête. On peut accéder à cette instance dans des implémentations personnalisées de ChoiceWidget.create_option() pour ajuster le code HTML produit.

ModelChoiceIteratorValue possède la méthode suivante :

__str__()Lien vers cette définition

Renvoie value  comme chaîne qui sera produite en HTML.

Création de champs personnalisésLien vers cette rubrique

Si les classes Field intégrées ne correspondent pas à vos besoins, vous pouvez créer des classes Field personnalisées. Pour cela, créez une sous-classe de django.forms.Field. Les seules exigences sont que la méthode clean() doit être implémentée et que la méthode __init__() accepte les paramètres de base mentionnés plus haut (required, label, initial, widget, help_text).

Il est aussi possible de personnaliser la manière dont un champ est accédé en surchargeant get_bound_field().