在JSON中返回纯Django表单错误

Den*_*gan 38 django unicode json lazy-evaluation django-forms

我有一个Django表单,我在正常的Django视图中进行验证.我试图找出如何提取纯错误(没有HTML格式).下面是我目前正在使用的代码.

return json_response({ 'success' : False,
                       'errors' : form.errors })
Run Code Online (Sandbox Code Playgroud)

有了这个,我从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')
Run Code Online (Sandbox Code Playgroud)

Sys*_*dox 34

这看起来有所改善.以下适用于Django 1.3:

return json_response({
    'success': False,
    'errors': dict(form.errors.items()),
})
Run Code Online (Sandbox Code Playgroud)

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


Den*_*gan 24

经过大量的搞乱,测试不同的东西后得到它.NB我不确定这是否也适用于国际化.这也会为每个字段带来第一个验证错误,但修改它以获得所有错误应该相当容易.

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

  • 你也可以尝试:`form.error_class.as_text(v)`on`v`(这是一个ErrorList),而不是在'v`的每个项目上调用`__unicode __()` (5认同)
  • 错误 = dict([(k, form.error_class.as_text(v)) for k, v in form.errors.items()]) 返回 json_response({"errors":errors}) (4认同)
  • 我发现以下内容可以提供更好的结构,并且还可以满足多于1个错误的项目:`{k:v for k,v in context ['signup_form'].errors.items()}` (2认同)

lam*_*ave 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)
Run Code Online (Sandbox Code Playgroud)