112 votes

Injecter des erreurs dans un formulaire déjà validé ?

Après mon form.Form valide les valeurs saisies par l'utilisateur et les transmet à un processus distinct (externe) pour un traitement ultérieur. Ce processus externe peut potentiellement trouver d'autres erreurs dans les valeurs.

Existe-t-il un moyen d'injecter ces erreurs dans le formulaire déjà validé afin qu'elles puissent être affichées via les méthodes habituelles d'affichage des erreurs de formulaire (ou existe-t-il de meilleures approches alternatives) ?

L'une des suggestions était d'inclure le traitement externe dans la validation du formulaire, ce qui n'est pas idéal car le processus externe fait beaucoup plus que simplement valider.

134voto

rstuart85 Points 1280

Pour Django 1.7+, vous devez utiliser form.add_error() au lieu d'accéder à form._errors directement.

Documentation : https://docs.djangoproject.com/en/stable/ref/forms/api/#django.forms.Form.add_error

98voto

John Millikin Points 86775

Form._errors peut être traité comme un dictionnaire standard. Il est considéré comme une bonne pratique d'utiliser l'option ErrorList et d'ajouter les erreurs à la liste existante :

from django.forms.utils import ErrorList
errors = form._errors.setdefault("myfield", ErrorList())
errors.append(u"My error here")

Et si vous voulez ajouter des erreurs non liées au champ, utilisez django.forms.forms.NON_FIELD_ERRORS (la valeur par défaut est "__all__" ) au lieu de "myfield" .

0 votes

Pour correspondre à ce que fait Django, vous devez insérer des objets ErrorList.

3 votes

Cela semble un peu désagréable, puisque le nom "_errors" suggère qu'il est censé être interne à la classe de formulaire. Est-ce la façon standard de faire cela dans Django ? Je suis dans une situation similaire à celle du PO : j'ai un formulaire où les utilisateurs fournissent un nouveau nom qui doit être unique dans la base de données. S'il y a une collision, j'aimerais renvoyer le formulaire avec une erreur, mais je ne le saurai pas tant que je n'aurai pas essayé d'insérer la base de données. (En théorie, le validateur pourrait vérifier la base de données, mais cela sent mauvais et est sujet à des erreurs).

1 votes

@scompt : merci, corrigé. @Weeble : _errors fait partie de l'API publique du formulaire, malgré son nom ; voir la réponse d'insin pour un lien vers la documentation.

13voto

insin Points 19509

Vous pouvez ajouter des détails supplémentaires sur les erreurs dans le formulaire _errors directement :

https://docs.djangoproject.com/en/1.5/ref/forms/validation/#described-later https://docs.djangoproject.com/en/1.6/ref/forms/validation/#modifying-field-errors

6 votes

Et apparemment dans la version de développement postérieure à la 1.6, ils ajoutent une add_error fonction : docs.djangoproject.com/fr/dev/ref/forms/api/

0 votes

Et maintenant, Django 1.7 dispose d'une fonction officielle add_error : docs.djangoproject.com/fr/1.7/ref/forms/api/

9voto

Timma Points 98

Ajouter une erreur à un champ spécifique :

form.add_error('fieldName', 'error description')

**Ajout d'une erreur pour les champs non renseignés **

form.add_error(None, 'error description')
#Only pass None instead of field name

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X