具有django-guardian分配的权限的对象在admin中不可见

jul*_*jul 7 django permissions django-admin django-authentication django-guardian

我正在使用django-guardian来管理每个对象的权限.

对于给定的用户,我授予对一个对象的所有权限:

joe = User.objects.get(username="joe")

mytask = Task.objects.get(pk=1)

assign('add_task', joe, mytask)
assign('change_task', joe, mytask)
assign('delete_task', joe, mytask)
Run Code Online (Sandbox Code Playgroud)

我按预期得到了:

In [57]: joe.has_perm("add_task", mytask)
Out[57]: True

In [58]: joe.has_perm("change_task", mytask)
Out[58]: True

In [59]: joe.has_perm("delete_task", mytask)
Out[59]: True
Run Code Online (Sandbox Code Playgroud)

在admin.py中我也使TaskAdmin继承GuardedModelAdmin而不是admin.ModelAdmin

现在当我用joe连接到我的网站时,我得到了管理员:

You don't have permission to edit anything 
Run Code Online (Sandbox Code Playgroud)

我不应该能够编辑对象mytask吗?

我是否必须使用内置的基于模型的权限系统设置一些权限?

我错过了什么吗?

编辑

我试图添加选项user_can_access_owned_objects_only,这应该是我的问题,但我仍然看不到我的管理员...

class TaskAdmin(GuardedModelAdmin):

    user_can_access_owned_objects_only = True

    pass

admin.site.register(Task, TaskAdmin)
Run Code Online (Sandbox Code Playgroud)

谢谢

jul*_*jul 4

为了只查看当前用户拥有的实例,我授予他所有权限

add_task=Permission.objects.get(codename="add_task")
change_task=Permission.objects.get(codename="change_task")
delete_task=Permission.objects.get(codename="delete_task")

joe.user_permissions.add(add_task)
joe.user_permissions.add(change_task)
joe.user_permissions.add(delete_task)
Run Code Online (Sandbox Code Playgroud)

然后我使用 Guardian.shortcuts.assign 在几个实例上设置权限,并在管理中过滤查询集:

class TaskAdmin(admin.ModelAdmin):

    def queryset(self, request):
            if request.user.is_superuser:
                return super(TaskAdmin, self).queryset(request)
            return get_objects_for_user(user=request.user, perms=['add_task', 'change_task', 'delete_task'], klass=Task)
Run Code Online (Sandbox Code Playgroud)

它远非完美,但我找不到任何其他解决方案。