我有一个Django表单,我在正常的Django视图中验证。我试图找出如何提取纯错误(没有HTML格式)。下面是我目前正在使用的代码。
return json_response({ 'success' : False,
'errors' : form.errors })
有了这个,我从Django得到了臭名昭着的代理对象错误。将每个错误强制转换为Unicode也不会起到作用,因为每个错误'__unicode__
方法都会被有效地调用它。
有什么想法吗?
编辑:
对于那些感兴趣的人,这是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 :(得分:32)
这似乎有所改善。以下适用于Django 1.3:
return json_response({
'success': False,
'errors': dict(form.errors.items()),
})
不再需要__unicode__
或延迟翻译。这也为每个字段提供了完整的错误数组。
答案 1 :(得分:24)
在麻烦的很多之后得到它,测试不同的东西。注:我不确定这是否也适用于国际化。这也会为每个字段带来第一个验证错误,但修改它以获得所有错误应该相当容易。
return json_response({ 'success' : False,
'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })
答案 2 :(得分:24)
对于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)
答案 3 :(得分:4)
这里的问题是错误信息是懒惰的翻译对象。 docs确实提到了这个:
确保你有ensure_ascii = False并使用LazyEncoder。
答案 4 :(得分:1)
我们可以这样做:
import simplejson as json
errors = json.dumps(form.errors)
return HttpResponse(errors, mimetype='application/json')
答案 5 :(得分:1)
json.dumps
无法序列化django的代理功能(如延迟翻译)。
作为documented,你应该创建一个新的Encoder类:
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)
全部:)