Python 如何覆盖Django 1.11中的用户名验证?

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继承

我的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)

使用每个验证函数扩展您的
错误记录(如有必要)。

很好-在这种情况下如何累积验证错误?