我觉得这个问题相当愚蠢,但无论如何我都会这样做。 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中的源代码,它似乎没有标记无效字符。这里发生了什么?看来,如果您想要捕获错误的用户名,则必须通过表单验证来完成。
答案 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."))