Django 用户管理器不检查模型验证器
Django User Manager Not Checking Model Validators
我正在使用自定义的 Django 用户模型。我已经创建了一切,并且一切看起来都很完美,直到我尝试从模板上的注册页面调用 create_user。
它是在不考虑我在模型中放置的验证器的情况下创建用户的。在我尝试使用 create_user 操作之前,验证器工作正常。
def validate_reg(value):
try:
x = SignUpAccess.objects.get(reg_key=value)
if x.is_used == True:
raise ValidationError(
message='Your validation number is used already',
)
except SignUpAccess.DoesNotExist:
raise ValidationError(
message='Your validation number does not exist',
)
class User(AbstractUser):
username = None
email = models.EmailField(
unique=True,
max_length=75,
# db_index=True,
primary_key=True,
verbose_name='email address'
)
reg_number = models.CharField(
max_length=12,
unique=True,
null=True,
validators=[validate_reg]
)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
REQUIRED_FIELDS = []
USERNAME_FIELD = 'email'
objects = UserManager()
如上所示,我在注册号中添加了一个验证程序,以确保只有拥有有效注册号的人才可以在网站上创建帐户。当我尝试从管理员创建用户(这真的毫无意义)时,这非常有效。
与自定义用户模型一样,我有一个用户管理器
class UserManager(BaseUserManager):
def create_user(self, email, first_name, last_name, reg_number, password=None):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
first_name=first_name,
last_name=last_name,
reg_number=reg_number,
)
user.set_password(password)
user.save()
return user
在我尝试在我的注册视图中创建用户之前,一切都应该正常,
def register_user(request):
user = User
if request.method == "POST":
email = request.POST['email']
first_name = request.POST['first_name']
last_name = request.POST['last_name']
reg_number = request.POST['reg_number']
password = request.POST['password']
user.objects.create_user(
email,
first_name,
last_name,
reg_number,
password=password,
)
调用创建用户,同时在模板上测试它,输入无效的注册号仍然会创建一个注册号无效的用户,这不应该工作因为模型本身有一个验证器在应该停止它的注册字段上。看起来 create_user 管理器正在绕过验证器,请帮助。
你试过完全清洁吗?
class MyModle(models.Model):
def save(self, *args, **kwargs):
try:
self.full_clean()
super(MyModle, self).save(*args, **kwargs)
except IntegrityError:
raise ValidationError("error message")
我正在使用自定义的 Django 用户模型。我已经创建了一切,并且一切看起来都很完美,直到我尝试从模板上的注册页面调用 create_user。 它是在不考虑我在模型中放置的验证器的情况下创建用户的。在我尝试使用 create_user 操作之前,验证器工作正常。
def validate_reg(value):
try:
x = SignUpAccess.objects.get(reg_key=value)
if x.is_used == True:
raise ValidationError(
message='Your validation number is used already',
)
except SignUpAccess.DoesNotExist:
raise ValidationError(
message='Your validation number does not exist',
)
class User(AbstractUser):
username = None
email = models.EmailField(
unique=True,
max_length=75,
# db_index=True,
primary_key=True,
verbose_name='email address'
)
reg_number = models.CharField(
max_length=12,
unique=True,
null=True,
validators=[validate_reg]
)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
REQUIRED_FIELDS = []
USERNAME_FIELD = 'email'
objects = UserManager()
如上所示,我在注册号中添加了一个验证程序,以确保只有拥有有效注册号的人才可以在网站上创建帐户。当我尝试从管理员创建用户(这真的毫无意义)时,这非常有效。
与自定义用户模型一样,我有一个用户管理器
class UserManager(BaseUserManager):
def create_user(self, email, first_name, last_name, reg_number, password=None):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
first_name=first_name,
last_name=last_name,
reg_number=reg_number,
)
user.set_password(password)
user.save()
return user
在我尝试在我的注册视图中创建用户之前,一切都应该正常,
def register_user(request):
user = User
if request.method == "POST":
email = request.POST['email']
first_name = request.POST['first_name']
last_name = request.POST['last_name']
reg_number = request.POST['reg_number']
password = request.POST['password']
user.objects.create_user(
email,
first_name,
last_name,
reg_number,
password=password,
)
调用创建用户,同时在模板上测试它,输入无效的注册号仍然会创建一个注册号无效的用户,这不应该工作因为模型本身有一个验证器在应该停止它的注册字段上。看起来 create_user 管理器正在绕过验证器,请帮助。
你试过完全清洁吗?
class MyModle(models.Model):
def save(self, *args, **kwargs):
try:
self.full_clean()
super(MyModle, self).save(*args, **kwargs)
except IntegrityError:
raise ValidationError("error message")