我使用的是自定义用户,我想直接在模型中对用户创建进行验证。
我之前不希望在表单中进行此验证的原因是因为User对象可以从其他地方创建(例如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
答案 0 :(得分: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)
这很有效,谢谢你。
我唯一感到不舒服的是,当我使用注册表单创建我的用户时,它会对数据执行双重验证(第一次使用表单验证程序,第二次使用模型本身)。它不是很干......
如果有更好的话,我不接受答案。