DJANGO - 仅为“模型”中的某些对象将管理员面板的权限分配给用户

时间:2018-06-15 14:34:18

标签: django

DJANGO

在使用我的超级用户帐户的ADMIN PANEL中,我想授予用户查看/更改/删除某些对象的权限,而不是所有这些来自Model.By默认情况下在ADMIN PANEL中你可以给出整个模型的权限,而不是来自它的某些对象(模型)。

我会举个例子:

class Professor(models.Model):
user                = models.ForeignKey(User,on_delete=models.CASCADE) 
lastname            = models.CharField(max_length=25,null=True,blank=False)
firstname           = models.CharField(max_length=25,null=True,blank=False)
email               = models.EmailField(max_length=40,null=True,blank=False)


class Course(models.Model):
name            = models.CharField(max_length=50,null=True,blank=False)
professor       = models.ForeignKey(Professor,on_delete=models.CASCADE)
content         = models.TextField(blank=True,null=True,help_text='')

例如,我将创建3个课程:X,Y,Z。 教授教Y和Z. 流程是:我的超级用户我将从管理员面板为这位教授创建一个用户,我将给他工作人员状态,我也想给他一个仅来自模型课程(Y和Z)的2个对象的权限,而不是所有人。所有其中我希望从管理面板更改为更容易。

我该怎么做?

在决赛中,我希望很容易从ADMIN PANEL获得权限,而不是从整个Model获得权限,而是从中获得一些对象。

非常感谢你。

1 个答案:

答案 0 :(得分:0)

当您使用django管理员时,您可以使用has_change_permissionModelAdmin方法:

class CourseAdmin(admin.ModelAdmin):
    def has_change_permission(self, request, obj=None):
        if obj is None:
            return True
        return request.user == obj.professor

注意:需要首先检查None,因为文档说明:

  

如果obj为,则应返回 True False ,以指示是否允许查看此类型的对象。

这样可行,但列表视图仍会显示所有Course个对象。让教授们很难知道他们可以编辑哪些教授。我们可以使用get_queryset方法更改列表视图中显示的对象:

class CourseAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        return queryset.filter(professor=request.user)

注意:您可能希望为超级用户编辑这两种方法。