2017-02-20 108 views
0

我有以下型号:Django的监护人许可 - 对于一个在一对多关系的对象设置权限

项目:

class Project(models.Model): 
    project_name = models.CharField(max_length=100, unique=True) 

SearchCodes:

class SearchCode(models.Model): 
    project = models.ForeignKey(Project, on_delete=models.CASCADE) 
    search_code = models.CharField(max_length=3) 
    search_code_modifier = models.CharField(max_length=1) 

    class Meta: 
    unique_together = ('project', 'search_code', 'search_code_modifier',) 

Django-Guardian docs我可以在Django管理员中设置权限。那么对于一个项目,我可以检查/用户限制在一个视图中,像这样:

def project_edit(request, pk_project): 

    project = get_object_or_404(Project, pk=pk_project) 
    project_name = project.project_name 

    user = request.user 

    # Check user permission at the object level by passing in this specific project 
    if user.has_perm('myApp.change_project', project): 
     ...do something 

现在,这里是我在哪里卡住了。我如何在任何与Django-Admin中的项目相关的SearchCodes上设置权限?我不想在SearchCodes上设置对象级权限 - 这只是SearchCode的每个实例。相反,我需要能够在管理中设置:

您可以查看与此项目相关的每个SearchCode,而不是任何其他SearchCodes。

请让我知道如果我需要更具体 - 我试图尽可能通用。

谢谢 - 任何帮助或指针将不胜感激。

编辑:

我用Admin-Integration例如设置在Django守护项目对象级权限。

感觉就像在这个时候,当我在这个项目的Object-Permissions页面中时,必须有一些方法来设置与这个特定项目实例相关的所有SearchCodes的权限。

回答

1

Django-guardian是对象级许可应用程序,因此对该对象进行许可和检查以获得许可的对象分配权限。在你特别的例子中,你必须编写类似的东西来检查通过项目的代码权限(许可进位对象):

def code_edit(request, pk): 

    code = get_object_or_404(SearchCode.objects.select_related('project'), pk=pk) 
    project = code.project 
    project_name = project.project_name 

    user = request.user 

    # Check user permission at the object level by passing in this specific project 
    if user.has_perm('myApp.change_project', project): 
     ...do something 
+0

谢谢你的回应。这对设置权限后检查权限非常有用(+1) - 但我正在寻找关于如何在Django-Admin的SearchCodes上设置权限的指针/教程等。虽然我猜我可能可以使用这个概念,并在SearchCode层面推出我自己的权限 - 我宁愿在管理员中做 - 为了用户的缘故和一致性:) – beginAgain