10
votes

Comment ajouter un message d'erreur pour former.Non_Field_Errors à Django?

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.")


0 commentaires

3 Réponses :


18
votes
  1. appel complet_clean () , cela devrait initialiser form._errors . Cette étape est critique, si vous ne le faites pas, cela ne fonctionnera pas.

  2. FAITE LA LISTE D'ERREUR , il faut une liste de messages, l'instabilité en tant que telle: error_list = form.error_class (["Vos messages d'erreur '])

  3. Attribuez la liste d'erreur à non_field_errors , vous devez importer non_field_errors à partir de django.forms.Forms , puis assigner comme tel : form._errors [non_field_errors] = error_list

    Voici une démonstration d'une coquille: xxx


6 commentaires

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.



5
votes

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.

  1. AS de Django 1.6+ Le dictionnaire des erreurs est stocké sous forme de form.Errors et non Form._Errors li>
  2. Si vous instaniez FORM.IS_VALID (), c'est l'équivalent d'exécuter FULL_CLEAN () LI>
  3. non_field_errors n'est pas nécessaire d'importer, vous pouvez simplement vous reporter à sa clé de dictionnaire par défaut de __ tout __ code> li> ol>

    Exemple: P>

    if form.is_valid():
        form.errors['__all__'] = form.error_class(['Your Error Here!'])
    


3 commentaires

Bien en général, il est préférable d'utiliser des constantes définies, c'est-à-dire. non_field_errors sur sa valeur __ tous __ . Aussi, autant que je comprends bien, le point de définir des erreurs non champs avant appeler is_valid () est de pouvoir réellement influencer le résultat du is_valid ( ) .


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 ". 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.



0
votes

self._errors.setdefault ('__ tous__', erreur ()). EXTENDRE ([""])


0 commentaires