使用 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 本地化文件的翻译失败。 但对于所有有类似问题的人:

  1. 创建(如果还没有)语言环境文件 (https://docs.djangoproject.com/en/1.9/topics/i18n/translation/#localization-how-to-create-language-files)

  2. 将这些行添加到 django.po msgid "Enter a valid email address." msgstr "Введите правильный адрес электронной почты."(或您需要的其他翻译)

  3. 编译 (django-admin compilemessages)