0

我有以下型号:

项目:

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

搜索代码:

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 文档中,我可以在 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 中设置与项目相关的任何 SearchCode 的权限?我不想在 SearchCodes 上设置对象级权限——这只是 SearchCode 的每个实例。相反,我需要能够在管理员中设置:

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

如果我需要更具体,请告诉我 - 我已尝试使其尽可能通用。

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

编辑:

我使用Admin-Integration示例在 Django-Guardian 中设置项目对象级权限。

感觉在这一点上,当我在此项目的对象权限页面中时,必须有某种方法来设置与此特定项目实例相关的所有 SearchCode 的权限。

4

1 回答 1

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
于 2017-02-21T00:35:22.730 回答