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

2 投票
1 回答
567 浏览
提问于 2025-04-18 18:04

我正在使用自定义用户,并且想在模型中直接进行用户创建的验证。

我不想只在表单中进行验证的原因是,用户对象可能会从其他地方创建(比如API、Django命令行等)。

问题:目前,电子邮件的验证是正确的(注意我已经去掉了用户名字段)。但是,我该如何对密码进行验证呢?现在,空密码也能通过,所以我想这根本没有验证。我想用我的 REGEX_PASSWORD = r'[A-Za-z0-9@#$%^&+=]{8,}' 来进行密码验证。

以下是我的 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

1 个回答

0

根据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)

这个方法有效,非常感谢。

不过有一点我不太满意,就是当我用注册表单来创建用户时,它会对数据进行两次验证(第一次是用表单的验证器,第二次是用模型本身)。这样做不太符合“不要重复自己”的原则……

我把这个回答留作未接受,以防有更好的方案。

撰写回答