2009-06-12 27 views
35

Tengo un formulario de Django que estoy validando en una vista normal de Django. Estoy intentando descubrir cómo extraer los errores puros (sin el formato HTML). A continuación está el código que estoy usando en este momento.Devolución de errores puros de formularios de Django en JSON

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

Con esto, aparece 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__ método se llamará HTML-izing efectivamente.

¿Alguna idea?

EDIT:

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') 
+0

La respuesta aceptada está desactualizada. Consulte https://stackoverflow.com/a/28256365/604511 – aitchnyu

Respuesta

24

que recibió después de una gran cantidad de jugar un poco, probando cosas diferentes. nótese bien 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()] }) 
+5

, también puede probar: 'form.error_class.as_text (v)' on 'v' (que es una lista de errores), en lugar de llamar a' __unicode __() 'en cada elemento de 'v' – tehfink

+3

errors = dict ([(k, form.error_class.as_text (v)) para k, v en form.errors.items()]) return json_response ({" errors ": errors}) – digitalPBK

+2

Encontré lo siguiente para proporcionar una mejor estructura y también para artículos con más de 1 error: '{k: v para k, v en contexto ['signup_form']. Errors.items()}' – DanH

4

El problema aquí es que el mensaje de error es un objeto de traducción vago. El docs menciona esto:

Solo asegúrate de que tienes ensure_ascii = False y usa un LazyEncoder.

+0

Ese es el camino a seguir. Agregué una respuesta que brinda algunos detalles sobre este enfoque. – bjunix

30

Parece que se ha mejorado. Las siguientes obras en Django 1.3:

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

No hay necesidad de __unicode__ o traducción perezosa más. Esto también proporciona una gama completa de errores para cada campo.

+0

Esto no parece funcionar – digitalPBK

+0

@digitalPBK cuidado para elaborar? – SystemParadox

+1

Obtuve el mismo error que cuando se usa form.errors, el objeto (Clase Lazy) no se puede serializar. – digitalPBK

1

Podemos hacer esto:

import simplejson as json 

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

json.dumps no se puede serializar función de proxy de Django (como traducciones de descanso).

Como documented se 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) 

utilizar el nuevo codificador de la siguiente manera:

json.dumps(s, cls=LazyEncoder) 

Eso es todo :)

19

Para Django 1.7+ uso o Form.errors.as_json() algo como esto:

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