Django Custom BaseUserManager: перезаписанный create_user не используется, перезаписанный create_superuser работает безупречно. Как?
Я работаю над проектом Django, где у меня есть пользовательский AbstractBaseUser и пользовательский BaseUserManager. Логично, что я создал их довольно рано, и поскольку они делали то, что должны были делать, я продолжил работу над проектом. Теперь я нахожусь в точке, где я хочу добавить атрибут userTag к пользовательскому User и вызвать функцию generate_userTag, когда пользователь создается (то же самое для суперпользователя). Поэтому я добавил эту функцию в create_user, которая у меня уже "работала"; по крайней мере, я думал, что так и будет. Оказалось, что никакие изменения, которые я делаю в функции create_user, не применяются и не оказывают никакого влияния на проект. Как будто функция никогда не вызывается. Я добавил ValueError, который должен возникать каждый раз, когда вызывается функция, но когда я регистрирую нового пользователя с тестового сайта, ошибки нет, и пользователь создается без userTag.
Теперь самое странное: Я протестировал создание суперпользователя и, к моему удивлению, все работает безупречно. Суперпользователь был создан, с тегом userTag. Все в порядке.
Итак, мой вопрос: Что может заставить Django не вызывать пользовательский create_user при создании пользователя, но вызывать пользовательский create_superuser при создании суперпользователя?
Спасибо за помощь
account/models.py
class MyAccountManager(BaseUserManager):
def create_user(self, email, username, password=None):
if not email:
raise ValueError('Users must have an email address')
if not username:
raise ValueError('Users must have a username')
user = self.model(
email=self.normalize_email(email),
username=username,
userTag=generate_userTag(username),
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
username=username,
)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name="email", max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
userTag = models.CharField(max_length=35, default="#00000")
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
profile_image = models.ImageField(max_length=255, upload_to=get_profile_image_filepath, null=True, blank=True, default=get_default_profile_image)
hide_email = models.BooleanField(default=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = MyAccountManager()
def __str__(self):
return self.username
settings.py
AUTH_USER_MODEL = 'account.Account'
Я исправил это, заменив
form.save()
с
account = get_user_model().objects.create_user(username=username, email=email, password=raw_password)
в представлении регистрации.
Я все еще не уверен, в чем была проблема, так что если кто-либо может объяснить, буду признателен.