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')
Était-ce utile?

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 :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top