在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)
就这样 :)