【问题标题】:Extending User model with one to one field- how to set user instance in view使用一对一字段扩展用户模型-如何在视图中设置用户实例
【发布时间】:2018-12-13 03:36:23
【问题描述】:

我正在尝试使用与 UserProfile 模型的一对一关系来扩展用户模型。我添加了一些布尔字段,并在视图中尝试将这些字段用作权限。

这是我的模型:

class UserProfile(models.Model):

    user = models.OneToOneField(User)
    FirstName = models.CharField(max_length=25)
    LastName = models.CharField(max_length=25)
    ProximityAccess = models.BooleanField(default=True)
    NewProxAccess = models.BooleanField(default=False)

    def __unicode__(self):
        return self.user.username

这是我尝试使用的视图:

@login_required
def NewProx(request):
    if UserProfile.NewProxAccess:
        if request.method == 'POST':
            form = ProxForm(request.POST)
            if form.is_valid():
                ProxPart_instance = form.save(commit=True)
                ProxPart_instance.save()
                return HttpResponseRedirect('/proximity')
        else:
            form = ProxForm()
            return render(request, 'app/NewProx.html', {'form': form})
    else:
        raise PermissionDenied

我没有收到任何错误消息,但它没有按预期工作。我希望如果用户配置文件将 NewProxAccess 设置为 False 它会提高 PermissionDenied 但它不会。我已经连接了管理模块,我可以选择或取消选择该字段的复选框,但它没有效果。如果我注释掉其余部分,我可以让它显示 Permission Denied 错误,所以它必须在视图中(我认为)。我想我错过了将登录用户建立为用户实例的行,因此我们可以检查用户是否具有权限。我知道有很多方法可以做到这一点,并且可能有更好的方法,但为了学习,我缺少什么让这个工作?

谢谢 斯科特

【问题讨论】:

    标签: django


    【解决方案1】:

    当您想检查特定配置文件的访问权限而不是 UserProfile 模型时,您需要这样做:

       if request.user.userprofile.NewProxAccess:
            # your code
    

    注意:根据 PEP8 最佳实践,您应该仅使用 camelCase 命名类。对于 attrs,函数使用下划线:my_function

    【讨论】:

    • 非常感谢。我从没想过要换案子。我将阅读 PEP8。
    猜你喜欢
    • 2019-05-12
    • 2017-08-07
    • 2018-07-21
    • 2011-02-22
    • 2017-03-19
    • 2012-10-02
    • 2021-11-16
    相关资源
    最近更新 更多