简体   繁体   English

user_passes_test 用于 Django 中除用户以外的模型

[英]user_passes_test for models other than User in Django

I want to allow a user to edit a project page if ifAdmin (an object in uProject model) == True.如果 ifAdmin(uProject 模型中的 object)== True,我想允许用户编辑项目页面。 I am currently trying to use @user_passes_test to render a view to update the project, but am having difficulties.我目前正在尝试使用 @user_passes_test 呈现视图以更新项目,但遇到了困难。 I am getting uProjects from main.models, and I am working in projects.views.我正在从 main.models 获取 uProjects,并且正在使用 projects.views。 Here's my code.这是我的代码。

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

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

models.py模型.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

The difficulty is I'm trying to have admin_check work with uProjects, not the User model.困难是我试图让 admin_check 与 uProjects 一起工作,而不是用户 model。 I'm also trying to see if ifAdmin == True, but the way I did above renders an error.我也在尝试查看 ifAdmin == True,但我上面所做的方式会导致错误。 The error is that the "User object has no attribute ifAdmin"错误是“用户 object 没有属性 ifAdmin”

You can use something like this:你可以使用这样的东西:

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

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

But this will work for any user which has ifAdmin permission in atleast one uProject instance.但这适用于在至少一个 uProject 实例中拥有 ifAdmin 权限的任何用户。 It can't distinguish by uProject information.它无法通过 uProject 信息进行区分。

To do that, you can write a custom dectorator like this:为此,您可以像这样编写自定义析构器:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM