【问题标题】:user_passes_test for models other than User in Djangouser_passes_test 用于 Django 中除 User 之外的模型
【发布时间】:2021-06-18 17:35:04
【问题描述】:

如果 ifAdmin(uProject 模型中的对象)== True,我希望允许用户编辑项目页面。我目前正在尝试使用 @user_passes_test 呈现视图以更新项目,但遇到了困难。我正在从 main.models 获取 uProjects,并且正在使用 projects.views。这是我的代码。

def admin_check(uProjects):
    return uProjects.ifAdmin = True

@user_passes_test(admin_check)
def update(request): etc, etc, etc

models.py

class uProjects(models.Model):
   
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    ifAccepted = models.BooleanField(null = True, blank=False, default=False)
    #ifLeader = models.BooleanField(null = False, blank=False)
    ifAdmin = models.BooleanField(null = True, blank=False, default=False)
    title = models.CharField(max_length=100, null=False, blank=False)
    def __str__(self):
        return self.user.username + ',' + self.project.name

困难在于我试图让 admin_check 与 uProjects 一起工作,而不是 User 模型。我也在尝试查看 ifAdmin == True,但我上面所做的方式会导致错误。错误是“用户对象没有属性ifAdmin”

【问题讨论】:

  • 请详细说明一下,有什么困难...??
  • @ShivendraPratapKushwaha 困难在于我试图让 admin_check 与 uProjects 一起工作,而不是 User 模型。我也在尝试查看 ifAdmin == True,但我上面所做的方式会导致错误。错误是“用户对象没有属性 ifAdmin”
  • 可以分享模型吗?
  • @ruddra 我刚刚编辑了主帖并将其添加到那里
  • @AndrewBregman 你在做uProjects.ifAdmin = True 而不是uProjects.ifAdmin == True

标签: python django permissions


【解决方案1】:

你可以这样使用:

def admin_check(user):
    return user.uprojects_set.filter(ifAdmin=True).exists()

@user_passes_test(admin_check)
def update(request): etc, etc, etc

但这适用于在至少一个 uProject 实例中拥有 ifAdmin 权限的任何用户。无法通过uProject信息进行区分。

为此,您可以像这样编写自定义析取器:

from functools import wraps
from django.http import HttpResponseRedirect

def admin_check(function):
  @wraps(function)
  def wrap(request, *args, **kwargs):
        user = request.user
        name = kwargs.get('name')  # assuming you are getting the project id here via url: "/<project_id:int>"
        if uProjects.objects.filter(title=name, user=user, ifAdmin=True).exists():
             return function(request, *args, **kwargs)
        else:
            return HttpResponseRedirect('/')

  return wrap

【讨论】:

  • 感谢您的好评。对于此代码:def admin_check(user): return user.uproject_set.filter(ifAdmin=True).exists() @user_passes_test(admin_check) def update(request): etc, etc, etc 我仍然遇到错误,因为用户没有属性 uproject_set。我认为这可能是因为用户是 uProjects 的一部分,但 uProjects 不是用户的子部分,如果这有意义的话。
  • 对于第二个代码,我的 url 是项目名称如下:path('project/&lt;str:name&gt;/', p.project, name='project'), 我还有一个关于第二个代码的快速问题。返回函数时,如何将其与编辑项目页面的视图相关联?
  • 我已经更新了我的答案。我已经更新了两个代码 sn-ps。
  • 谢谢。对于这些代码 sn-ps,当我去运行我的代码时,即使我登录的用户在 uProjects 模型中有 ifAdmin = True,当我去点击编辑项目时,它也会返回 HttpResponseRedirect('/' ),而不是让我编辑项目。
  • 这里是代码:def admin_check(function): @wraps(function) def wrap(request, *args, **kwargs): user = request.user name = kwargs.get('name') if uProjects.objects.filter(title=name, user=user, ifAdmin=True).exists(): return function(request, *args, **kwargs) else: return HttpResponseRedirect('/') return wrap @admin_check def update(request): etc etc
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 2017-01-22
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2023-03-04
  • 2016-03-21
  • 2020-02-26
相关资源
最近更新 更多