我有一个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')
有帮助吗?

解决方案 2

很多 四处乱逛,测试不同的事情。 NB我不确定这是否也可以与国际化一起使用。这也对每个字段都遇到了第一个验证错误,但是对其进行修改以获取所有错误应该很容易。

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

其他提示

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

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

无需 __unicode__ 或懒惰翻译。这也给每个字段提供了全部错误。

用于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)

这里的问题是错误消息是懒惰的翻译对象。这 文档 请提一下:

只需确保您有Sune_ascii = false并使用leazyencoder即可。

我们做得到:

import simplejson as json

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

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

作为 记录 您应该创建一个新的编码器类:

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)

就这样 :)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top