在JSON中返回纯Django表单错误

时间:2009-06-12 12:36:50

标签: django json unicode django-forms lazy-evaluation

我有一个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')

6 个答案:

答案 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)

全部:)