Django管理员限制权利

时间:2017-08-21 08:09:39

标签: python django admin

在我的Django项目中,我有模型ProjectPersonTaskInfo

然而,事情是项目是父模型。人,任务和信息属于项目。

如果我添加一个Person,Task或Info,我必须选择它所属的Project(ForeignKey)。

我的问题:这些项目是独立的,我有不同的项目经理。我的目标是在管理界面中,项目A的项目经理只能向HIS项目添加一个Person,与Info和Task相同。

我不希望项目A的项目经理可以看到/编辑/添加/删除项目B的内容。很遗憾,我找不到符合我要求的Django管理员选项。

如果项目经理登录,他应该只看到属于他的项目的实例,没有别的。

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

根据我的理解,我认为你的模型结构如下:

class Project(models.Model):
    manager = models.ForeignKey(User)
    ...

class Person(models.Model):
    project = models.ForeignKey(Project)
    ...

admin.py中,您可以执行各种修改以实现目标

class PersonAdmin(admin.ModelAdmin):
    # other code

    # this function will list persons
    # only whose project has current user as project manager
    def get_queryset(self, request):
        qs = super(PersonAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(project__manager__user=request.user)

    # this function will list the projects in dropdowns
    # who has current user as project manager
    def render_change_form(self, request, context, *args, **kwargs):
        if not request.user.is_superuser:
            context['adminform'].form.fields['project'].queryset = Project.objects.filter(manager__user=request.user)
        return super(PersonAdmin, self).render_change_form(request, context, args, kwargs)

    # this function is used for edit permission
    def has_change_permission(self, request, obj=None):
    if not obj:
        return True 
    return obj.project.manager.user == request.user or request.user.is_superuser

    # this function is used for delete permission
    def has_delete_permssion(self, request, obj=None):
        if not obj:
            return True
        return obj.project.manager.user == request.user or request.user.is_superuser

类似方法可用于admin

中的其他模型