1

我正在使用 django 的管理员来让用户管理特定模型的模型实例。每个用户应该只能管理他的模型实例。(除了应该管理所有的管理员)。

如何过滤管理员更改列表视图中的对象?

想法:

  • 我想最优雅的方法是使用Object-level permissions。有人知道这个的实现吗?
  • 是否可以通过使用 ModelAdmin.changelist_view 覆盖管理员的视图来做到这一点?
  • list_select_related 与它有什么关系吗?
4

1 回答 1

9

您可以覆盖管理员的queryset- 方法以仅显示用户的项目:

    def queryset(self, request):
        user = getattr(request, 'user', None)
        qs = super(MyAdmin, self).queryset(request)
        if user.is_superuser:
            return qs
        return qs.filter(user=user)

除此之外,您还应该注意has_change_permissionandhas_delete_permission方法,例如:

    def has_delete_permission(self, request, obj=None):   
        if not request.user == obj.user and not request.user.is_superuser:
            return False
        return super(MyAdmin, self).has_delete_permission(request, obj)

一样has_change_permissionlist_select_related仅在获取管理员的查询集以立即从关系中获取相关数据时使用,而不是在需要时使用!

如果您的主要目标只是限制用户无法使用其他对象,则上述方法将起作用,如果它变得越来越复杂并且您不能简单地从 ONE 属性(例如用户)中分辨出权限,请查看django 的行级权限提案!

于 2010-06-01T20:39:17.520 回答