42

我有一个 Django 表单,我正在一个普通的 Django 视图中验证它。我试图弄清楚如何提取纯错误(没有 HTML 格式)。以下是我目前正在使用的代码。

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

有了这个,我从 Django 中得到了臭名昭著的代理对象错误。将每个错误强制转换为 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')
4

6 回答 6

37

这似乎得到了改善。以下适用于 Django 1.3:

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

不再需要__unicode__或懒惰的翻译。这也为每个字段提供了完整的错误数组。

于 2012-01-12T14:47:09.553 回答
32

对于 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)
于 2015-03-03T21:08:55.237 回答
25

经过很多混乱,测试不同的东西后得到它。注意我不确定这是否也适用于国际化。这也需要每个字段的第一个验证错误,但修改它以获取所有错误应该相当容易。

return json_response({ 'success' : False,
                       'errors' : [(k, v[0].__unicode__()) for k, v in form.errors.items()] })
于 2009-06-12T13:04:00.770 回答
4

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

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

于 2009-06-12T20:42:10.437 回答
1

我们做得到:

import simplejson as json

errors = json.dumps(form.errors)
return HttpResponse(errors, mimetype='application/json')
于 2014-04-07T16:01:54.233 回答
1

json.dumps无法序列化 django 的代理功能(如惰性翻译)。

文档所述,您应该创建一个新的 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)

就这样 :)

于 2014-09-11T09:14:35.690 回答