【问题标题】:Override get_queryset based on django-guardian permissions根据 django-guardian 权限覆盖 get_queryset
【发布时间】:2023-03-29 13:06:01
【问题描述】:

我正在尝试根据用户从 django Guardian 获得的对象权限覆盖 get_queryset,以便只有用户有权访问的对象可见。

def get_queryset(self, request):
    if request.user.is_superuser:
        qs = super(MyAdminInline, self).get_queryset(request)
        return qs  

    for item in MyModel.objects.all():
        for perm in get_perms(request.user, item):
            things_user_can_see = get_objects_for_user(request.user, perm)
            return things_user_can_see

遗憾的是,这实际上什么都不做,并且所有项目,无论用户拥有什么权限,都是可见的。

【问题讨论】:

    标签: python django django-guardian


    【解决方案1】:

    首先,您需要了解您的视图需要哪些权限。 然后,根据这些权限获取对象。

    如果您不知道对象的权限,那么您可以通过与模型相关的所有权限过滤您的对象。

    Docs 用于获取:

    from guardian.shortcuts import get_objects_for_user, get_perms_for_model
    
    class MyAdminInline():
        def get_queryset(self, request):
            if request.user.is_superuser:
                qs = super(MyAdminInline, self).get_queryset(request)
                return qs  
    
            all_model_perms = get_perms_for_model(MyModel)
            return get_objects_for_user(request.user, all_model_perms)
    

    仅此而已!无需遍历每个对象,检查权限并返回错误的方式。

    【讨论】:

      猜你喜欢
      • 2020-10-07
      • 2020-05-03
      • 2020-11-08
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多