Retour pur Django les erreurs de forme en JSON
J'ai un Django forme que je suis la validation dans des conditions normales de Django vue. Je suis à essayer de comprendre comment extraire la pure erreurs (sans mise en forme HTML). Ci-dessous le code que j'utilise pour le moment.
return json_response({ 'success' : False,
'errors' : form.errors })
Avec ceci, j'obtiens l'infâme objet proxy erreur de Django. Forcer chaque erreur dans Unicode ne suffit pas non plus, parce qu'alors, chacune des erreurs' __unicode__
méthode sera appelée efficacement HTML-izing il.
Des idées?
EDIT:
Pour ceux que cela intéresse, c'est la définition de json_response
:
def json_response(x):
import json
return HttpResponse(json.dumps(x, sort_keys=True, indent=2),
content_type='application/json; charset=UTF-8')
- L'on a accepté la réponse est obsolète. Voir stackoverflow.com/a/28256365/604511
Vous devez vous connecter pour publier un commentaire.
Cela semble avoir été améliorée. Les ouvrages suivants, en Django 1.3:
Pas besoin de
__unicode__
ou paresseux traduction plus. Cela donne également une gamme complète d'erreurs pour chaque champ.Qu'il a obtenu après un beaucoup de déconner, le test de différentes choses. N. B. je ne suis pas sûr que cela fonctionne avec l'internationalisation ainsi. Ceci prend également la première erreur de validation pour chaque champ, mais en le modifiant pour obtenir toutes les erreurs doivent être plutôt facile.
form.error_class.as_text(v)
surv
(qui est un ErrorList), au lieu de l'appeler__unicode__()
sur chaque élément dev
{k: v for k, v in context['signup_form'].errors.items()}
Pour Django 1.7+ utilisation Forme.erreurs.as_json() ou quelque chose comme ceci:
Le problème ici est que le message d'erreur sont paresseux traduction de l'objet.
Le docs faire oublier ceci:
Juste assurez-vous que vous avez ensure_ascii=Faux et usage d'un LazyEncoder.
Nous pouvons le faire:
json.dumps
ne peut pas sérialiser django de procuration de la fonction (comme paresseux traductions).Comme documenté vous devez créer une nouvelle classe de Codeur:
Utiliser le nouveau Codeur comme ceci:
C'est tout 🙂