【问题标题】:Django: Why is create_user not working? (Custom BaseUserManager)Django:为什么 create_user 不起作用? (自定义 BaseUserManager)
【发布时间】:2021-09-15 12:05:26
【问题描述】:

我正在开发一个 Django 项目,其中有一个自定义 AbstractBaseUser 和一个自定义 BaseUserManager。从逻辑上讲,我很早就创建了这些,并且由于他们正在做他们应该做的事情,所以我继续进行项目。 现在,我想将属性 userTag 添加到自定义用户,并且我想在创建用户时调用函数 generate_userTag(对于超级用户也是如此)。所以我将这个功能添加到我已经“工作”的 create_user 中;至少我认为会的。事实证明,我在 create_user 函数中所做的任何更改都没有被应用或对项目产生任何影响。就像函数永远不会被调用一样。我添加了一个 ValueError ,它应该在每次调用函数时引发,但是当我从测试站点注册新用户时,没有错误,并且在没有 userTag 的情况下创建了用户。

现在奇怪的部分:我测试了创建一个超级用户,令我惊讶的是它可以完美地工作。使用 userTag 创建超级用户。一切都很好。

所以我的问题是:什么可能导致 Django 在创建用户时不调用自定义 create_user,但在创建超级用户时调用自定义 create_superuser?

感谢您的帮助


帐户/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

帐户/views.py

def register_view(request, *args, **kwargs):
    user = request.user
    if user.is_authenticated: 
        return HttpResponse("You are already authenticated as " + str(user.username))

    context = {}
    if request.POST:
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            email = form.cleaned_data.get('email').lower()
            raw_password = form.cleaned_data.get('password1')
            account = authenticate(email=email, password=raw_password)
            login(request, account)
            destination = kwargs.get("next")
            if destination:
                return redirect(destination)
            return redirect('home')
        else:
            context['registration_form'] = form

    else:
        form = RegistrationForm()
        context['registration_form'] = form
    return render(request, 'account/register.html', context)

settings.py

AUTH_USER_MODEL = 'account.Account'

【问题讨论】:

  • 如何使用./manage.py createsuperuser 创建超级用户?以及如何创建用户?你能提供两者的代码/命令吗?
  • 对于超级用户,我使用 ./manage.py createsuperuser。对于用户,我使用registration_view 函数(在上面添加)。我基本上复制了那部分,所以我不能 100% 确定那里发生了什么。 form.save() 是否创建了新用户?
  • 您没有提供导入,所以我不确定您使用的是哪个RegistrationForm。由于这是 Python,您可以简单地查看它的代码以了解它在做什么。配置良好的 IDE(例如 VisualStudioCode 或 PyCharm)将通过允许您单击参考并打开相应的代码来轻松帮助您。

标签: python django customization


【解决方案1】:

我通过替换来修复它

form.save()

account = get_user_model().objects.create_user(username=username, email=email, password=raw_password)

在注册视图中。

我仍然不确定问题是什么,所以如果某人能解释一下,我很感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多