Менеджер пользователей Django не проверяет валидаторы моделей
Я использую пользовательскую модель пользователя 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, тестируя ее на шаблоне, при вводе неверного регистрационного номера все равно создается пользователь с неверным регистрационным номером, а это не должно работать поскольку в самой модели есть валидатор на поле регистрации, который должен его останавливать. Похоже, что менеджер 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")