如何在UserCreationForm

时间:2019-03-25 20:33:35

标签: django python-2.7

我有一个多语言应用程序(Django 1.11),具有用于创建新用户的表单。以这种形式,用户发送无效输入时的错误消息必须根据所选语言以葡萄牙语(pt-BR)或英语(en-US)发出。定制验证和用于验证的一些自动Django消息翻译得很好,但是没有以下内容:“密码与用户名太相似”。 “此密码太短。它必须包含至少8个字符。”和“此密码太常见了”。实际上,它们是用葡萄牙语显示的,因为settings.py中的LANGUAGE_CODE是'pt-BR'。

我能够翻译一些自动消息,例如“具有该用户名的用户已存在”。使用django.utils.translation.activate,如以下代码所示。

from django.utils.translation import activate
activate(curr_lang)

但这还不足以转换来自settings.AUTH_PASSWORD_VALIDATORS的验证。我手动将LANGUAGE_CODE从“ pt-BR”更改为“ en-US”,并且只能看到英语消息。翻译这些消息的最佳策略是什么?据我研究,设置LANGUAGE_CODE是不可行的,因为我发现结果建议使用django.utils.translation.activate。预先感谢

1 个答案:

答案 0 :(得分:0)

经过几次尝试,我认为解决方法是:

  1. 在settings.py的MIDDLEWARE中添加“ django.middleware.locale.LocaleMiddleware”(请注意at the documentation所述的顺序)
MIDDLEWARE = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
...
  1. 还在LANGUAGE_CODE之后的settings.py处添加LANGUAGES常量,该语言必须包含默认语言
LANGUAGE_CODE = 'pt-BR'
LANGUAGES = [
  ('pt-BR', 'Portuguese'),
  ('en-US', 'English'),
]
  1. 使用Django的默认set_language方法-在urls.py上,添加以下行:
urlpatterns = [
....
    url(r'^i18n/', include('django.conf.urls.i18n')),

并且,在带有语言选择的html文件上,

{% load i18n %}
{% load staticfiles %}

<form action="{% url 'set_language' %}" method="post">{% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <select name="language" id="curr_lang" class="select2-single" onchange="this.form.submit()">
        {% get_current_language as LANGUAGE_CODE %}
        {% get_available_languages as LANGUAGES %}
        {% get_language_info_list for LANGUAGES as languages %}
        <option value="pt-BR" title="Português" {% if LANGUAGE_CODE == 'pt-br' %}selected{% endif %}>{% static 'img/flags/br.png' %}</option>
        <option value="en-US" title="English" {% if LANGUAGE_CODE == 'en-us' %}selected{% endif %}>{% static 'img/flags/us.png' %}</option>
    </select>
</form>
  1. 在context_processor.py上,定义一个要在每个视图末尾运行的函数(我正在调用global_env)。在settings.py上,添加“您的应用程序名称-此处.context_processor.global_env”,例如
TEMPLATES = [
        ...
        'OPTIONS': {
            'context_processors': [
                'your-application-name-here.context_processor.global_env',
                 ...

并且,在context_processor.py上,该函数必须具有

def global_env(request):
    from django.utils.translation import activate

    curr_lang = request.session[LANGUAGE_SESSION_KEY]
    activate(curr_lang)

    # More code to render dictionary to views for non-default messages on page 
    ....

我认为这些步骤无需使用custom validators就可以完成来自Django的默认表单验证消息的翻译。