在django admin中过滤基于用户的模型实例

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

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

思考:

>我想最优雅的方法是使用Object-level permissions.任何人都知道这个的实现?
>是否可以通过使用ModelAdmin.changelist_view覆盖管理员的视图来完成?
> list_select_related与它有什么关系吗?

最佳答案
您可以覆盖admin的queryset-method以仅显示用户的项目:

    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_permission和has_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_permission也一样!
list_select_related仅在获取管理员的查询集时才使用,以便立即从关系中获取相关数据,而不是在需要时!

如果您的主要目标只是限制用户无法使用其他对象,则上述approch将起作用,如果它变得更复杂并且您无法简单地从ONE属性(如用户)告知权限,请查看django的提议是行级权限!

转载注明原文:在django admin中过滤基于用户的模型实例 - 代码日志