Pregunta

Tengo un formulario Django que estoy validando en una vista Django normal. Estoy tratando de descubrir cómo extraer los errores puros (sin el formato HTML). A continuación se muestra el código que estoy usando en este momento.

return json_response({ 'success' : False,
                       'errors' : form.errors })

Con esto, obtengo el infame error de objeto proxy de Django. Forzar cada error en Unicode tampoco hará el truco, porque entonces cada uno de los errores ' __unicode__ El método se llamará efectivamente htmlizandolo.

¿Algunas ideas?

EDITAR:

Para los interesados, esta es la definición 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')
¿Fue útil?

Solución 2

Lo tengo después de un lote de jugar, probar cosas diferentes. NB No estoy seguro de si esto también funciona con la internacionalización. Esto también toma el primer error de validación para cada campo, pero modificarlo para obtener todos los errores debería ser bastante fácil.

return json_response({ 'success' : False,
                       'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })

Otros consejos

Esto parece haber sido mejorado. Los siguientes trabajan en Django 1.3:

return json_response({
    'success': False,
    'errors': dict(form.errors.items()),
})

Sin necesidad de __unicode__ o traducción perezosa ya. Esto también ofrece una gama completa de errores para cada campo.

Para django 1.7+ use Form.errors.as_json () o algo como esto:

errors = {f: e.get_json_data() for f, e in form.errors.items()}
return json_response(success=False, data=errors)

El problema aquí es que el mensaje de error es el objeto de traducción perezosa. los documentos Mencione esto:

Solo asegúrese de tener asegurar_ascii = falso y use uncerebrayEncoder.

Podemos hacer esto:

import simplejson as json

errors = json.dumps(form.errors)
return HttpResponse(errors, mimetype='application/json')

json.dumps No se puede serializar la función proxy de Django (como las traducciones perezosas).

Como documentado Debe crear una nueva clase de codificador:

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)

Use el nuevo codificador como este:

json.dumps(s, cls=LazyEncoder)

Eso es todo :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top