2009-05-07 8 views
2

J'utilisetableau de validation Django d'erreurs

rf['email'].errors 

Comme le dit docs, je peux l'utiliser pour avoir le tableau d'erreurs.

[str(e) for e in rf['email'].errors] #give me ["<django.utils.functional.__proxy__>"] 

Si repr ou str - il donne ul ou chaîne de tableau. Donc, cela ne fonctionnait que lorsque j'utilisais ensemble repr et eval. Mais je pense que c'est une solution stupide.

eval(`rf['email'].errors`) 
+0

Juste des éclaircissements couple, si vous ne me dérange pas: 1) est-rf un formulaire de django? Et rf ['email'] un django FormField? 2) Quel est le résultat que vous essayez d'obtenir? Est-ce la chaîne HTML pour les erreurs? Ou autre chose? –

+0

1. rf est Form; 2. rf ['email'] est FormField; 3. J'essaie d'atteindre JSON. J'utilise des formulaires pour la validation. –

Répondre

2

Vous avez quelques options en fonction de la sortie que vous souhaitez.

La première option, utilisez le constructeur unicode pour convertir les données:

list_of_error_texts = [unicode(e) for e in rf['email'].errors] 

(. L'objet proxy de Django implémente une méthode qui répond à unicode)

Option deux, obtenir le ErrorList sous forme de texte. Cela produit une nouvelle ligne liste séparée texte d'erreur, chaque ligne précédée d'un astérisque:

print rf['email'].errors.as_text() 
* My error one 
* My error two 

option trois, la fonction de l'utilisation django force_unicode. C'est comme unicode, mais possède des caractéristiques de sécurité supplémentaires:

from django.utils.encoding import force_unicode 
list_of_error_texts = [force_unicode(e) for e in rf['email'].errors] 
+0

Avez-vous une idée pourquoi le comportement expliqué dans les docs ne fonctionne pas et nous devons faire comme vous l'avez fait? – Tiago

+0

Les docs promettent que vous pouvez faire une boucle sur les erreurs de champ, mais les seuls exemples dans les docs (AFAICT) sont dans des modèles, pas dans python comme OP comme écrit. Lorsque vous parcourez la ErrorList qui revient de rf ['email'], vous obtenez une série d'objets ValidationError. L'infrastructure de template de Django appelle force_unicode(), qui vérifie d'abord s'ils ont une méthode '__unicode__'. Comme ils le font, c'est invoqué, plutôt que le str() de l'exemple de l'OP. Donc je ne dirais pas que le comportement dans les docs ne marche pas, juste que les exemples n'incluent pas le scénario de l'OP :-) –