Python Django:如何在models.py中执行用户验证?

Python Django:如何在models.py中执行用户验证?,python,django,django-models,Python,Django,Django Models,我使用的是自定义用户,我想直接在模型中对用户创建执行验证 我不想只在表单中执行此验证的原因是,用户对象可以从其他地方创建(例如API、Django shell等) 问题:目前,验证在电子邮件上正确执行(请注意,我删除了用户名字段)。 但我该如何验证密码呢?目前,空密码有效,所以我猜根本没有验证。我想使用我的REGEX_PASSWORD=r'[A-Za-z0-9@$%^&+=]{8,}'执行pwd验证 以下是我的UserManager类和User类: class UserManager(BaseU

我使用的是自定义用户,我想直接在模型中对用户创建执行验证

我不想只在表单中执行此验证的原因是,用户对象可以从其他地方创建(例如API、Django shell等)

问题:目前,验证在电子邮件上正确执行(请注意,我删除了用户名字段)。 但我该如何验证密码呢?目前,空密码有效,所以我猜根本没有验证。我想使用我的
REGEX_PASSWORD=r'[A-Za-z0-9@$%^&+=]{8,}'
执行pwd验证

以下是我的UserManager类和User类:

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        ''' Creates and saves a User with the given email and password '''

        email = UserManager.normalize_email(email)
        user = self.model(email=email,
                          is_staff=False, is_active=True, is_superuser=False,
                          **extra_fields)
        user.set_password(password)

        user.full_clean()

        user.save(using=self._db)
        return user

class User(AbstractBaseUser, PermissionsMixin):
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    email = models.EmailField(unique=True, db_index=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now())

    objects = UserManager()

    USERNAME_FIELD = 'email' # Ce champ définit le username
    REQUIRED_FIELDS = [] # Aucun autre champ requis à part email et pwd

按照yedpodtrzitko的想法,下面是我所做的:

def set_password(self, raw_password):
    if not re.match(REGEX_PASSWORD, raw_password):
        raise ValidationError(ERR_BAD_PWD_FORMAT)
    super(User, self).set_password(raw_password)
这很有效,谢谢你

唯一让我感到不舒服的是,当我使用注册表单创建用户时,它会对数据执行双重验证(第一次使用表单验证程序,第二次使用模型本身)。天气不太干燥


我让答案不被接受,以防有更好的答案。

只需覆盖方法
设置\u密码
,然后在那里做你需要做的事(+然后打电话给它的家长)谢谢!我详细说明了你的答案以帮助他人:)