【问题标题】:How to change django admin permissions based on a field value?如何根据字段值更改 django 管理员权限?
【发布时间】:2021-09-28 01:16:54
【问题描述】:

我有一个模型,其中教授属于某个部门

Class Professor(models.Model):
  name=models.CharField(max_length=50)
  code=models.CharField(max_length=9)
  dept=models.ForeignKey('Department', on_delete=models.CASCADE)

系的模型只是它的名字,有多个教授指向它。

是否有办法根据部门名称的值设置查看或编辑权限?说,如果我希望属于 A 部门的教授只能由具有 A 权限的人编辑,而属于 B 部门的教授可以由具有 B 权限的人编辑,等等,那么实现它的方法是什么管理员?

编辑:我已经搜索了 django 文档,但我看不出是否可以根据任何模型的字段更改管理员的权限(在创建对象时无需手动分配用户),我d 很高兴有人指出如何做到这一点的高级概述,或者知道为什么不能做到。

【问题讨论】:

    标签: python django


    【解决方案1】:

    在你的管理类中,你可以试试这个:

    class ProfessorAdmin(admin.ModelAdmin):
        # ...
        
        def has_change_permission(self, request, obj=None):
            if obj:
                if obj.dept == "A":
                     return request.user.has_perm('DeptA')
                elif obj.dept == "B":
                     return request.user.has_perm('DeptB')
            return super(ProfessorAdmin, self).has_change_permission(self, request, obj)
    

    如您所见,我们可以访问两件重要的事情

    1. 请求上下文和想要更改数据的 request.user。因此,我们可以检查该用户的任何属性( is_superuser / is_staff / has_perm() )并自定义逻辑。

    2. 正在更改/更新的实例,因此,我们可以根据任何字段值自定义逻辑。

    Django 文档参考here

    【讨论】:

      【解决方案2】:

      推荐阅读:

      https://realpython.com/manage-users-in-django-admin/

      所以可以,只需按部门创建组,按部门组为每个用户分配编辑权限。

      【讨论】:

      • 谢谢,我会尝试应用那篇文章中的技术来解决我的问题