【问题标题】:Django-Guardian Permissions - Set permissions for objects in a on-to-many relationshipDjango-Guardian Permissions - 为一对多关系中的对象设置权限
【发布时间】:2017-02-20 17:55:17
【问题描述】:

我有以下型号:

项目:

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

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

如果我需要更具体,请告诉我 - 我已尽量保持通用性。

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

编辑:

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

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

【问题讨论】:

    标签: django-admin database-relations django-guardian


    【解决方案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
    

    【讨论】:

    • 感谢您的回复。这对于在设置权限后检查权限非常有帮助(+1) - 但我正在寻找有关如何在 Django-Admin 中设置 SearchCodes 权限的指针/教程等。虽然我想我可能可以使用这个概念并在 SearchCode 级别滚动我自己的权限 - 我宁愿在管理员中这样做 - 为了用户和一致性:)
    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多