在JSON中返回纯Django表单错误

zy1mlcev  于 2023-01-31  发布在  Go
关注(0)|答案(8)|浏览(172)

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

quhf5bfb1#

这一点似乎已经得到了改进。Django 1.3中有以下工作:

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

不再需要__unicode__或延迟转换。这也为每个字段提供了完整的错误数组。

yks3o0rb

yks3o0rb2#

对于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)
w8f9ii69

w8f9ii693#

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

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

wmvff8tz4#

这里的问题是错误消息是惰性转换对象。文档确实提到了这一点:
只要确保你有确保ascii=假,并使用一个懒惰编码器。

svujldwt

svujldwt5#

我们可以这样做:

import simplejson as json

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

gijlo24d6#

json.dumps不能序列化django的代理函数(比如lazy translations)。
如前所述,您应该创建一个新的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)

就是这样:)

bxfogqkk

bxfogqkk7#

你应该在built方法中使用django。

from django.http import JsonResponse
return JsonResponse(form.errors.as_json())
hpxqektj

hpxqektj8#

我使用get_json_data()求解如下:

data = form.errors.get_json_data()
return JsonResponse(data, status=400, safe=False)

我们得到一个有效的json:

{"amount": [{"message": "Ensure this value is greater than or equal to 100.", "code": "min_value"}]}

参见:www.example.comhttps://docs.djangoproject.com/en/4.1/ref/forms/api/#django.forms.Form.errors.get_json_data
如果我们这样使用as_json()

data = form.errors.as_json()
return JsonResponse(data, status=400, safe=False)

我们得到一个json格式的字符串:

"{\"amount\": [{\"message\": \"Ensure this value is greater than or equal to 100.\", \"code\": \"min_value\"}]}"

相关问题