我正在将我的网站移植到 django 1.9,但不知道如何正确解决此问题。
在我的表单中,我有 django 表单中常用的 EmailField。如果验证失败,它应该是有关它的消息(我将 'form_errors': form.errors}
传递给上下文进行操作)。
但在这种情况下 django 返回
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 时,即使我只想打印它也会引发此错误。 (打印 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__'>)
最佳答案
嗯。问题出在翻译上。在这种情况下 - 俄语本地化。 不知道为什么从“本地”django 本地化文件的翻译失败。 但对于所有有类似问题的人:
创建(如果仍然没有)区域设置文件 ( https://docs.djangoproject.com/en/1.9/topics/i18n/translation/#localization-how-to-create-language-files )
将这些行添加到
django.po
:msgstr "输入有效的电子邮件地址。" msgstr "Введите правильный адрес электронной почты."
(或您需要的其他翻译)编译(
django-admincompilemessages
)
关于python - 使用 EmailField 调用 form.errors 期间出现 DjangoUnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37772066/