J'ai une forme avec plusieurs champs. J'ai des contrôles de validation séparés pour chaque champ, effectué via la validation des formulaires. Cependant, je dois également vérifier si peu de champs sont remplis avant de rediriger l'utilisateur à une vue différente. J'espérais que je pouvais en quelque sorte appendez l'erreur de formulaires.non_field_errors car ce n'est pas pour un domaine particulier, mais je ne suis pas sûr de la syntaxe de droite pour cela. J'ai vérifié en ligne et trouvé ..
form.non_field_errors().append("Please complete your profile in order to access the content.")
3 Réponses :
appel complet_clean () strong>, cela devrait initialiser Voici une démonstration d'une coquille: p> form._errors code>. Cette étape est critique, si vous ne le faites pas, cela ne fonctionnera pas. P> li>
error_list = form.error_class (["Vos messages d'erreur ']) CODE > p> li>
non_field_errors code> à partir de
django.forms.Forms code>, puis assigner comme tel :
form._errors [non_field_errors] = error_list code> p> li>
Je sais que je peux le faire dans la méthode de form.clean (). Cependant, je préférerais le faire dans la vue et simplement ajouter une erreur à la liste Form.Errors, est-ce possible?
Bien oui c'est possible ma réponse le prouve :)
Merci JPIC pour votre réponse détaillée. Je vais essayer ce code et revenir. Désolé pour la réponse tardive, je suis parti en vacances.
En tant que FYI sur d'autres personnes en train de regarder cette réponse: cela fonctionne bien à Django 1.5.
La question initiale visait à ajouter une erreur à la liste (ne remplaçant pas complètement la liste). L'auteur a également réitéré cela dans la première réponse à cette question et a apparemment été ignoré. Cette réponse ne résout pas réellement la question du tout, car elle frottera toutes les erreurs non-champs existantes de la forme lorsqu'elle est pavée sur eux.
Il est vrai que la réponse se concentre davantage sur l'API de Django plutôt que sur "Comment utiliser les listes de Python" car l'auteur de la question semblait savoir comment utiliser des listes et semblait avoir du mal à se débatter avec l'API de Django. Bien qu'il aurait été possible de rendre la réponse deux fois plus longue en conférant à l'utilisation de la liste Python, je l'ai jugé insatisfaisant comme vous l'avez remarqué. C'est cool que cette réponse (PoC incluse) a été utile pour l'Angela (d'où le troisième commentaire). BTW, bienvenue à Stackoverflow! N'hésitez pas à contribuer à vos propres réponses ou à améliorer les réponses existantes. Merci d'avance pour votre contribution.
Ceci est un peu sorti, mais j'ai récemment couru dans la même question et je voulais perdre une lumière supplémentaire à ce sujet pour les futurs lecteurs.
__ tout __ code> li>
ol> Exemple: P>
if form.is_valid():
form.errors['__all__'] = form.error_class(['Your Error Here!'])
Bien en général, il est préférable d'utiliser des constantes définies, c'est-à-dire. non_field_errors code> sur sa valeur
__ tous __ code>. Aussi, autant que je comprends bien, le point de définir des erreurs non champs avant b> appeler
is_valid () code> est de pouvoir réellement influencer le résultat du
is_valid ( ) code>.
Je suis d'accord avec la partie constante de non_field_errors, je voulais juste signaler une alternative. En ce qui concerne la définition des erreurs de champ, ce que j'essayais de dire, c'est que les erreurs non-champs ne sont pas instanciées à moins que IS_VALID () ou FULL_CLEAN () est appelé du tout. Si vous essayez d'accéder avant d'exécuter une méthode, vous obtiendrez un KeyError. Sauf si vous essayiez de dire, c'est que l'on devrait exécuter Full_Clean () avant d'exécuter IS_VALID ()?
Ceci est plein de désinformation: Form.Errors est une propriété qui accède au formulaire de liste interne._Errors. Et il est une bonne pratique d'utiliser non_field_errors comme une constante puisque les développeurs peuvent un jour décider soudainement que la constante devrait être équivalente à la chaîne " la_le_loo i>". C'est pourquoi nous avons des constantes dans des langues - nous pouvons donc résumer et maintenir notre code plus facilement. Aussi, form.is_valid () n'est pas l'équivalent d'exécuter Full_Clean (). IS_VALID () appelle Form.Errors, qui appelle Full_Clean pour renseigner le dictionnaire _Errors.
self._errors.setdefault ('__ tous__', erreur ()). EXTENDRE ([""]) CODE> P>