在JSON中返回纯Django表单错误

我有一个Django的forms,我正在validation在正常的Django视图。 我想弄清楚如何提取纯粹的错误(没有HTML格式)。 以下是我目前使用的代码。

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

有了这个,我从Django得到臭名昭着的代理对象错误。 强制将每个错误转换为Unicode也不会__unicode__ ,因为每个错误的__unicode__方法都将被有效地称为HTML化。

有任何想法吗?

编辑:

对于那些感兴趣的,这是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') 

这似乎有所改善。 Django 1.3中的以下工作:

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

不再需要__unicode__或懒惰的翻译。 这也给每个领域的一系列错误。

经过大量的混乱,testing不同的东西后得到它。 NB我不确定这是否也适用于国际化。 这也需要每个字段的第一个validation错误,但修改它来获取所有的错误应该是相当容易的。

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

对于Django 1.7+使用Form.errors.as_json()或类似的东西:

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

这里的问题是这个错误消息是懒惰的翻译对象。 文档确实提到了这一点:

只要确保你有sure_ascii = False并使用LazyEncoder。

我们做得到:

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

json.dumps无法序列化django的代理函数(如懒惰的翻译)。

正如你所logging的,你应该创build一个新的编码器类:

 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) 

像这样使用新的编码器:

 json.dumps(s, cls=LazyEncoder) 

就这样 :)