Retour des erreurs de formulaire de django pur dans JSON
-
13-09-2019 - |
Question
J'ai une forme Django que je valide dans une vue Django normale. J'essaie de comprendre comment extraire les erreurs pures (sans le formatage HTML). Vous trouverez ci-dessous le code que j'utilise pour le moment.
return json_response({ 'success' : False,
'errors' : form.errors })
Avec cela, j'obtiens la fameuse erreur d'objet proxy de Django. Forcer chaque erreur dans Unicode ne fera pas non plus l'affaire, car chacune des erreurs ' __unicode__
La méthode sera appelée efficacement la réalisation de HTML.
Des idées?
ÉDITER:
Pour les personnes intéressées, 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')
La solution 2
Je l'ai après un parcelle de jouer, tester différentes choses. NB Je ne sais pas si cela fonctionne également avec l'internationalisation. Cela prend également la première erreur de validation pour chaque champ, mais le modifier pour obtenir toutes les erreurs devrait être assez facile.
return json_response({ 'success' : False,
'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })
Autres conseils
Cela semble avoir été amélioré. Ce qui suit fonctionne dans Django 1.3:
return json_response({
'success': False,
'errors': dict(form.errors.items()),
})
Pas besoin d __unicode__
Ou plus la traduction paresseuse. Cela donne également une gamme complète d'erreurs pour chaque champ.
Pour Django 1.7+, utilisez Form.errors.as_json () ou quelque chose comme ça:
errors = {f: e.get_json_data() for f, e in form.errors.items()}
return json_response(success=False, data=errors)
Le problème ici est que le message d'erreur est un objet de traduction paresseux. La docs Mentionnez ceci:
Assurez-vous simplement que vous avez assure_ascii = false et utilisez un LazyEncoder.
Nous pouvons le faire:
import simplejson as json
errors = json.dumps(form.errors)
return HttpResponse(errors, mimetype='application/json')
json.dumps
Impossible de sérialiser la fonction proxy de Django (comme les traductions paresseuses).
Comme documenté Vous devez créer une nouvelle classe d'encodeur:
import json
from django.utils.functional import Promise
from django.utils.encoding import force_text
from django.core.serializers.json import DjangoJSONEncoder
class LazyEncoder(DjangoJSONEncoder):
def default(self, obj):
if isinstance(obj, Promise):
return force_text(obj)
return super(LazyEncoder, self).default(obj)
Utilisez le nouvel encodeur comme ceci:
json.dumps(s, cls=LazyEncoder)
C'est tout :)