2010-11-19 5 views
22

J'ai un formulaire Django avec un tas de champs que je suis en train de rendre dans le modèle. J'ai aussi quelques éléments d'entrée HTML droits que je veux valider dans la vue en accédant aux vars request.POST. Si ceux-ci ne valident pas, je veux injecter une erreur dans le formulaire Django afin que je puisse l'afficher sur la page. Y-a-t-il un moyen de faire ça?Django: Ajout de non_field_error à la vue?

Répondre

28

Vous pouvez également utiliser la méthode très élégante add_error(). Fonctionne pour Django> = 1.7.

Si vous définissez field comme None forme traitera l'erreur comme un "non_field" un. Alors :

form.add_error(None, "I'm non-field error")

fonctionne comme un charme.

+1

Pour Django> = 1,7 – AliBZ

+1

Merci. J'ai mis à jour ma réponse. – grafa

6

Eh bien, vous pouvez insérer n'importe quoi dans le dictionnaire errors du formulaire, et les erreurs non-champ vont dans errors['__all__'].

Mais pourquoi gardez-vous des champs hors de la forme Django, seulement pour remettre leurs erreurs à la fin? Pourquoi ne pas mettre tous les champs dans le formulaire en premier lieu? Si c'est juste que vous utilisez un modelform et que vous voulez y ajouter des champs, vous pouvez le faire dans Django en déclarant simplement les champs au niveau du formulaire - vous pouvez alors définir des méthodes propres pour eux dans le formulaire.

class ExtendedModelForm(forms.ModelForm): 
    extra_field_1 = forms.CharField() 
    extra_field_2 = forms.CharField() 

    def clean_extra_field_1(self): 
     ...etc... 
+0

Voir mon autre question pour le raisonnement: http://stackoverflow.com/questions/4228722/django-checkboxselectmultiple Le domaine nécessite beaucoup de personnalisation, ce qui est assez difficile à faire avoir dans le formulaire. – mpen

+1

@Mark juste parce que vous voulez personnaliser l'affichage, ne signifie pas que vous ne pouvez pas inclure le champ dans le formulaire à des fins de validation et d'affichage des erreurs. –

+1

Bon ... si je le nomme correctement, Django ne connaîtra pas la différence hein? – mpen

21

Ajout à la réponse de Daniel, la syntaxe spécifique est:

form.errors['__all__'] = form.error_class(["error msg"]) 

Notez que vous pouvez remplacer '__all__' avec la NON_FIELD_ERRORS constante pour une meilleure compatibilité (crédit grafa).

from django.forms.forms import NON_FIELD_ERRORS