Python 如何覆盖Django 1.11中的用户名验证?
我的Django 1.11站点中有 在我的注册表上,我会提示输入用户名和密码。我已将MinimumLengthValidator和自定义WordCountValidator验证添加到settings.py中的passphrase字段中(请参见下文)——这些验证规则将自动呈现在注册表中 现在我想用三条规则来更改用户名验证:长度,必须以字母开头,只能包含字母数字字符。我不介意把这些合并成一条规则 我尝试添加到类中并进行设置,但什么也没发生——可能是因为我是从AbstractUser而不是User继承的 如何在用户名字段上使用自己的验证规则(最好是多子句) 表单的简化外观:Python 如何覆盖Django 1.11中的用户名验证?,python,django,validation,django-models,django-registration,Python,Django,Validation,Django Models,Django Registration,我的Django 1.11站点中有 在我的注册表上,我会提示输入用户名和密码。我已将MinimumLengthValidator和自定义WordCountValidator验证添加到settings.py中的passphrase字段中(请参见下文)——这些验证规则将自动呈现在注册表中 现在我想用三条规则来更改用户名验证:长度,必须以字母开头,只能包含字母数字字符。我不介意把这些合并成一条规则 我尝试添加到类中并进行设置,但什么也没发生——可能是因为我是从AbstractUser而不是User继承
Username: [ ]
Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.
Passphrase: [ ]
Your passphrase must contain at least 15 characters.
Passphrase must contain at least three words. Use spaces between words.
Passphrase confirmation: [ ]
Enter the same passphrase as before, for verification.
设置.py
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 15,
}
},
{
'NAME': 'custom.validators.WordCountValidator',
'OPTIONS': {
'min_words': 3,
}
},
]
class User(AbstractUser):
objects = UserManager()
def __init__(self, *args, **kwargs):
user = super(User, self).__init__(*args, **kwargs)
return user
...
class WordCountValidator(object):
...
class StartLetterValidator(object):
...
class AlphanumericValidator(object):
...
class CombinedValidator(object):
...
型号.py
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 15,
}
},
{
'NAME': 'custom.validators.WordCountValidator',
'OPTIONS': {
'min_words': 3,
}
},
]
class User(AbstractUser):
objects = UserManager()
def __init__(self, *args, **kwargs):
user = super(User, self).__init__(*args, **kwargs)
return user
...
class WordCountValidator(object):
...
class StartLetterValidator(object):
...
class AlphanumericValidator(object):
...
class CombinedValidator(object):
...
验证器.py
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 15,
}
},
{
'NAME': 'custom.validators.WordCountValidator',
'OPTIONS': {
'min_words': 3,
}
},
]
class User(AbstractUser):
objects = UserManager()
def __init__(self, *args, **kwargs):
user = super(User, self).__init__(*args, **kwargs)
return user
...
class WordCountValidator(object):
...
class StartLetterValidator(object):
...
class AlphanumericValidator(object):
...
class CombinedValidator(object):
...
覆盖User
模型的clean()
方法,并在那里调用验证器:
def clean(self):
# do some data-clean
# maybe do a super().clean() here
validator1 = WordCounterValidator(self)
validator1.myValidationMethod()
#...
validator2 = StartLetterValidator(self)
validator2.myValidationMethod()
#...
validator3 = AlphanumericValidator(self)
validator3.myValidationMethod()
#...
validator4 = CombinedValidator(self)
validator4.myValidationMethod()
#...
# maybe do a super().clean() here
为了简化验证代码,编写验证方法而不是验证类可能很有用。但我认为两种设计都可以
更新
由于答案的大小,评论中问题的扩展答案:
django为此作出了规定。如果要同时引发多个ValidationError
s,我建议使用字典收集错误:
err_dict = {}
然后简单地将一个错误添加到该dict中,字段名作为键,错误消息作为值:err_dict[“field name”]=“error mssg”
在您的clean()
结束时,只需使用if err\u dict
(如果dict中有错误则为true)检查您的dict是否存在错误,并使用raise ValidationError(err\u dict)
来提高这些错误
在你的情况下,你可能想做一些类似的事情
err_dict = validatot1.myValidationMethod(err_dict)
使用每个验证函数扩展您的
错误记录(如有必要)。很好-在这种情况下如何累积验证错误?