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)

в представлении регистрации.

Я все еще не уверен, в чем была проблема, так что если кто-либо может объяснить, буду признателен.

Вернуться на верх