为什么models.User允许用户名中的无效字符?

时间:2012-12-16 18:53:04

标签: django django-models

我觉得这个问题相当愚蠢,但无论如何我都会这样做。 Django文档"User authentication in Django"(v.1.4)中的“用户”API参考说明用户名可能只包含字母,数字和字符@,+,。, - 和_。然而,我可以进入Python shell并执行以下操作:

>>> from django.contrib.auth.models import User
>>> u = User.objects.create_user('joe#')

为什么不引发异常?我查看了../contrib/auth/models.py中的源代码,它似乎没有标记无效字符。这里发生了什么?看来,如果您想要捕获错误的用户名,则必须通过表单验证来完成。

1 个答案:

答案 0 :(得分:5)

我想开发人员希望为应用程序开发人员提供灵活性,以便我们可以存储特殊符号。因此,不是在模型级别验证输入,而是在表单中完成。你可以在django.contrib.auth.form.UserCreationForm里找到这个表格

摘录在这里:

您可以在“用户名”字段中使用“正则表达式”查看验证。

class UserCreationForm(forms.ModelForm):
    """
    A form that creates a user, with no privileges, from the given username and
    password.
    """
    error_messages = {
        'duplicate_username': _("A user with that username already exists."),
        'password_mismatch': _("The two password fields didn't match."),
    }
    username = forms.RegexField(label=_("Username"), max_length=30,
        regex=r'^[\w.@+-]+$',
        help_text = _("Required. 30 characters or fewer. Letters, digits and "
                      "@/./+/-/_ only."),
        error_messages = {
            'invalid': _("This value may contain only letters, numbers and "
                         "@/./+/-/_ characters.")})
    password1 = forms.CharField(label=_("Password"),
        widget=forms.PasswordInput)
    password2 = forms.CharField(label=_("Password confirmation"),
        widget=forms.PasswordInput,
        help_text = _("Enter the same password as above, for verification."))