使用 EmailField 调用 form.errors 期间出现 DjangoUnicodeDecodeError
DjangoUnicodeDecodeError during calling form.errors with EmailField
我正在将我的网站移植到 django 1.9,但不知道如何正确解决这个问题。
在我的表单中,我有来自 django 表单的常用 EmailField。如果验证失败,它应该是关于它的消息(我将 'form_errors': form.errors}
传递给上下文进行操作)。
但在那种情况下 django returns
DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in
position 0: ordinal not in range(128). You passed in
()
在 django.core.validators
中有一个验证器
@deconstructible
class EmailValidator(object):
message = _('Enter a valid email address.')
...
如果我将消息更改为 message = 'error'
一切正常。
所以,问题:如何在不编辑 django 文件的情况下解决这个问题?
问题出在调用 form.errors 时,即使我只想打印它也会出现此错误。 (print form.errors
)。其他字段错误(例如 IntegerField、URLField)工作正常,此问题仅针对 EmailField。
在视图过程中现在看起来像这样:
from django.http import JsonResponse
...
if form.is_valid():
...
else:
return JsonResponse({'form_errors': form.errors})
最后一个回溯是:
File "/path/views.py", line 331, in custom_form_post
response = JsonResponse({'form_errors': form.errors})
File "/path/.env/local/lib/python2.7/site-packages/django/http/response.py", line 505, in __init__
data = json.dumps(data, cls=encoder, **json_dumps_params)
File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/path/.env/lib/python2.7/_abcoll.py", line 581, in __iter__
v = self[i]
File "/path/.env/local/lib/python2.7/site-packages/django/forms/utils.py", line 146, in __getitem__
return list(error)[0]
File "/path/.env/local/lib/python2.7/site-packages/django/core/exceptions.py", line 165, in __iter__
yield force_text(message)
File "/path/.env/local/lib/python2.7/site-packages/django/utils/encoding.py", line 88, in force_text
raise DjangoUnicodeDecodeError(s, *e.args)
DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in <django.utils.functional.__proxy__ object at 0x40a6a90c> (<class 'django.utils.functional.__proxy__'>)
嗯。问题出在翻译上。在这种情况下 - 俄罗斯本地化。
不知道为什么 "native" django 本地化文件的翻译失败。
但对于所有有类似问题的人:
创建(如果还没有)语言环境文件 (https://docs.djangoproject.com/en/1.9/topics/i18n/translation/#localization-how-to-create-language-files)
将这些行添加到 django.po
:
msgid "Enter a valid email address."
msgstr "Введите правильный адрес электронной почты."
(或您需要的其他翻译)
编译 (django-admin compilemessages
)
我正在将我的网站移植到 django 1.9,但不知道如何正确解决这个问题。
在我的表单中,我有来自 django 表单的常用 EmailField。如果验证失败,它应该是关于它的消息(我将 'form_errors': form.errors}
传递给上下文进行操作)。
但在那种情况下 django returns
DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in ()
在 django.core.validators
中有一个验证器
@deconstructible
class EmailValidator(object):
message = _('Enter a valid email address.')
...
如果我将消息更改为 message = 'error'
一切正常。
所以,问题:如何在不编辑 django 文件的情况下解决这个问题?
问题出在调用 form.errors 时,即使我只想打印它也会出现此错误。 (print form.errors
)。其他字段错误(例如 IntegerField、URLField)工作正常,此问题仅针对 EmailField。
在视图过程中现在看起来像这样:
from django.http import JsonResponse
...
if form.is_valid():
...
else:
return JsonResponse({'form_errors': form.errors})
最后一个回溯是:
File "/path/views.py", line 331, in custom_form_post
response = JsonResponse({'form_errors': form.errors})
File "/path/.env/local/lib/python2.7/site-packages/django/http/response.py", line 505, in __init__
data = json.dumps(data, cls=encoder, **json_dumps_params)
File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/path/.env/lib/python2.7/_abcoll.py", line 581, in __iter__
v = self[i]
File "/path/.env/local/lib/python2.7/site-packages/django/forms/utils.py", line 146, in __getitem__
return list(error)[0]
File "/path/.env/local/lib/python2.7/site-packages/django/core/exceptions.py", line 165, in __iter__
yield force_text(message)
File "/path/.env/local/lib/python2.7/site-packages/django/utils/encoding.py", line 88, in force_text
raise DjangoUnicodeDecodeError(s, *e.args)
DjangoUnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128). You passed in <django.utils.functional.__proxy__ object at 0x40a6a90c> (<class 'django.utils.functional.__proxy__'>)
嗯。问题出在翻译上。在这种情况下 - 俄罗斯本地化。 不知道为什么 "native" django 本地化文件的翻译失败。 但对于所有有类似问题的人:
创建(如果还没有)语言环境文件 (https://docs.djangoproject.com/en/1.9/topics/i18n/translation/#localization-how-to-create-language-files)
将这些行添加到
django.po
:msgid "Enter a valid email address." msgstr "Введите правильный адрес электронной почты."
(或您需要的其他翻译)编译 (
django-admin compilemessages
)