【问题标题】:User-based model instances filtering in django admindjango admin 中基于用户的模型实例过滤
【发布时间】:2011-02-26 12:20:00
【问题描述】:

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

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

想法:

  • 我想最优雅的方法是使用Object-level permissions。有人知道这个的实现吗?
  • 是否可以使用 ModelAdmin.changelist_view 覆盖管理员的视图?
  • list_select_related 和它有关系吗?

【问题讨论】:

    标签: django django-models django-admin changelist


    【解决方案1】:

    您可以覆盖管理员的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_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 仅在获取管理员的查询集以立即从关系中获取相关数据时使用,而不是在需要时使用!

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

    【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2019-12-04
    • 2011-03-26
    • 1970-01-01
    • 2018-03-01
    • 2016-11-22
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多