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

Posted

技术标签:

【中文标题】DJANGO - 仅针对模型中的某些对象将管理面板的权限分配给用户【英文标题】:DJANGO - Assign permissions from Admin Panel to an user only for some objects from Model 【发布时间】:2018-06-15 14:34:18 【问题描述】:

DJANGO

在使用我的超级用户帐户的管理面板中,我想授予用户查看/更改/删除某些对象的权限,而不是所有来自模型的对象。默认情况下,在管理面板中,您可以授予整个模型的权限,而不是它(模型)中的某些对象的权限。

我给你举个例子:

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。 流程是:使用我的超级用户,我将从管理面板为该教授创建一个用户,我将给他 STAFF STATUS,我还想给他仅对模型课程(Y 和 Z)中的 2 个对象而不是所有对象的权限。全部其中我想从管理面板更改为更容易。

我该怎么做?

在决赛中,我希望能够轻松地从 ADMIN PANEL 授予权限,而不是整个模型,而是其中的一些对象。

非常感谢。

【问题讨论】:

看看这个***.com/questions/16053122/… 或者这个***.com/q/11138479/7692463 【参考方案1】:

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

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 为 None,则应返回 TrueFalse 以指示是否允许查看此类型的对象。 p>

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

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

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

【讨论】:

以上是关于DJANGO - 仅针对模型中的某些对象将管理面板的权限分配给用户的主要内容,如果未能解决你的问题,请参考以下文章

Django - 在管理面板中显示具有内容类型的模型

Django 模型中的有序列表

如何针对某些特定值对面板数据回归系数进行联合Wald检验?

Django将硬编码的href链接添加到管理模型的表单视图页面

如何仅将对象的一部分发送到django中的模板

仅具有查看权限的 Django 模型表单将所有字段排除在外