auth注册表单的提示错误

2017年8月29日 21:51 1207  0  Django python

在用django自带的auth模块时,无意中发现了其在注册表单中验证用户注册密码合法性时,有提示错误。具体情况,以及解决办法如下:

Django的auth内置用户注册表单

Django auth内置有一个用户注册的表单: django.contrib.auth.forms.UserCreationForm
其源码如下:

class UserCreationForm(forms.ModelForm):
    """
    A form that creates a user, with no privileges, from the given username and
    password.
    """
    error_messages = {
        'password_mismatch': _("The two password fields didn't match."),
    }
    password1 = forms.CharField(
        label=_("Password"),
        strip=False,
        widget=forms.PasswordInput,
    )
    password2 = forms.CharField(
        label=_("Password confirmation"),
        widget=forms.PasswordInput,
        strip=False,
        help_text=_("Enter the same password as before, for verification."),
    )

    class Meta:
        model = User
        fields = ("username",)
        field_classes = {'username': UsernameField}
    # 后面省略...

这里的 fields 是指定表单的字段,这些字段在模板中会被渲染成表单控件。默认的表单渲染后就只会有用户名(username)、密码、确认密码这三个表单控件。

template中注册页面的渲染

template模板中接收view.py视图函数中传入的由上述UserCreationForm定义的一个空的注册表单form

register.html

# 此前省略...
<form class="form" action="{% url 'users:register' %}" method="post">
{% csrf_token %}
    {% for field in form %}
        {{ field.label_tag }}
        {{ field }}
        {{ field.errors }}
        {% if field.help_text %}
            <p>{{ field.help_text|safe }}</p>
        {% endif %}
    {% endfor %}
    <button type="submit"> 注册 </button>
</form>
# 此后省略。。。
  • {{ field.label_tag }} 是相应控件的 label 标签
  • {{ field }} 是相应的表单控件
  • {{ field.errors }} 是表单的错误(若存在则显示)
  • {{ field.help_text|safe }} 是控件相关的帮助信息

实际效果和测试

然而,当输入密码为全数字时则会出现以下情况:


此时我想任何一个人应该都看的出来此处应该是显示 ‘密码不能全部为数字‘
我又试了几次,结果还是这样。于是我就开始在pycharm里按住ctrl一个个顺着表单往下点找源码,经过不懈努力,终于让我找到了。 此处的源码在django/contrib/auth/password_validation.py中,以下呈上源码:

# 此前省略...
class NumericPasswordValidator(object):
    """
    Validate whether the password is alphanumeric.
    """
    def validate(self, password, user=None):
        if password.isdigit():
            raise ValidationError(
                _("This password is entirely numeric."),  #重点看此处
                code='password_entirely_numeric',
            )

    def get_help_text(self):
        return _("Your password can't be entirely numeric.")

This password is entirely numeric
这句话貌似挺对的啊,说这个密码完全是纯数字,没毛病啊老铁。
为了验证这句话就是我们所要找的,于是我将setting中LANGUAGE_CODE 改回了英文,然后再看效果:

果然没毛病。此处只能得出一个结论了,LANGUAGE_CODE =‘zh-hans’这个翻译的有问题。

那么如果解决这个问题呢?

机智的我转眼看到了刚才源码下还有一句话,相信机智的你也看了,对就是这句话:
"Your password can't be entirely numeric."
将之前的那句话给注释掉,换成这句话

            raise ValidationError(
                # _("This password is entirely numeric."),
                code='password_entirely_numeric',  
                _("Your password can't be entirely numeric."),
            )

再进行测试,问题就解决了: