【问题标题】:Unable to content Django form with extended user model无法使用扩展用户模型来满足 Django 表单
【发布时间】:2019-08-11 13:19:48
【问题描述】:

尝试连接 Django 表单和扩展用户模型,但难以保存表单。基本上,我可以对用户进行身份验证,但不能将信息保存到用户的 CustomUser 模型或“配置文件”模型中。

我觉得我根本不了解如何扩展用户模型,所以如果您对此有一些建议,那将非常有帮助。

#views.py
def registration(request):
    if request.method == "POST":
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            custom = form.save(commit=False)
            user = request.user 
            custom = user.profile()
            custom.key = "".join(random.choice(string.digits) for i in range(20))
            custom.save()
            username = form.cleaned_data['username']
            password = form.cleaned_data['password2']
            user = authenticate(request, username=username, password=password)
            messages.success(request, f'Your account has been created! Please proceed to agreements and payment.')
            return redirect('other_page')
    else:
        form = CustomUserCreationForm(request.POST)
    return render(request, 'registration.html', {'form': form})

这是我的models.py

class CustomUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    key = models.CharField(max_length=25, null=True, blank=True)
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)
    username = models.CharField(max_length=25)
    password1 = models.CharField(max_length=25)
    password2 = models.CharField(max_length=25)

    @receiver(post_save, sender=User)
    def create_custom_user(sender, omstamce, created, **kwargs):
        if created:
            CustomUser.objects.create(user=instance)

    @receiver(post_save, sender=User)
    def save_user_profile(sender, instance, **kwargs):
        if instance.CustomUser.save()

    def __str__(self):   
        return f'{self.first_name} ({self.last_name})'

在 settings.py 我添加了“AUTH_PROFILE_MODULE = 'app.CustomUser'”。但是,我收到此错误:

AttributeError: 'User' object has no attribute 'profile'

【问题讨论】:

  • 你用的是什么 Django 版本?
  • 使用版本 Django 2.2.3

标签: django django-models django-forms


【解决方案1】:

AUTH_PROFILE_MODULE 自 1.7 起已弃用。它和 User 模型上的 get_profile() 方法被删除。 你应该使用AUTH_USER_MODEL

详细解释可以看这里https://docs.djangoproject.com/en/2.2/topics/auth/customizing/

顺便说一句,如果您刚开始一个新项目,强烈建议您使用 AbstractUser 创建自定义用户模型

如果您希望某些用户有不同的行为,那么我会说组和权限对您来说是不错的选择 https://docs.djangoproject.com/en/2.2/topics/auth/default/#topic-authorization

【讨论】:

  • 我尝试这样做,但遇到了一大堆问题,因为我的大多数用户没有个人资料,但注册用户会有。我想为大多数用户和一小部分用户使用 Django 基本用户模型 - 这个自定义模型。
  • 好吧,你不能有多个用于身份验证的模型,只有一个。您能否提供一个更详细的用例来说明您想要什么?
  • 当然,所以我有未注册的用户,他们可以查看未被阻止的内容,以及注册的用户,他们可以查看被阻止的内容。我需要一个足够灵活的用户模型来处理两个用户。当我尝试构建自定义模型时,它会强制所有用户进入基本模型或自定义模型。因此,对于这个用例,我需要扩展基本模型。
  • 这是我的旧自定义用户模式 ​​- 尝试了有关 AbstractBaseUser 的建议,但没有奏效:stackoverflow.com/questions/57446355/…
  • 我更新了我的答案。看起来您实际上需要权限而不是不同的用户模型。
猜你喜欢
  • 2017-10-20
  • 2017-02-01
  • 2012-07-18
  • 2016-10-12
  • 2011-02-28
  • 2013-12-06
  • 2018-01-21
相关资源
最近更新 更多