用户通过除Django中的用户之外的其他模型的用户测试

2024-10-01 15:29:03 发布

您现在位置:Python中文网/ 问答频道 /正文

如果ifAdmin(uProject模型中的对象)==True,我希望允许用户编辑项目页面。我目前正试图使用@user_passes_test来呈现视图以更新项目,但遇到了一些困难。我从main.models中获得了很多项目,我在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

困难在于我试图让管理员检查使用的是对象,而不是用户模型。我还试图查看ifAdmin==True,但是我上面所做的方式会导致一个错误。错误是“用户对象没有ifAdmin属性”


Tags: 项目对象用户selffalsetruemodelsdef
1条回答
网友
1楼 · 发布于 2024-10-01 15:29:03

您可以使用以下内容:

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权限的任何用户。它不能通过大量的信息来区分

为此,您可以编写如下自定义dectorator:

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

相关问题 更多 >

    热门问题