【问题标题】:Django queryset filtering not workingDjango 查询集过滤不起作用
【发布时间】:2016-04-13 09:04:02
【问题描述】:

我希望管理员用户只能看到他们创建的模型实例。我按照这些说明Filter django admin by logged in user

class FilterUserAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change):
        if getattr(obj, 'user', None) is None:  #Assign user only the first time, superusers can edit without changing user
            obj.user = request.user
        obj.save()
    def queryset(self, request):
        qs = super(FilterUserAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(user=request.user)
    def has_change_permission(self, request, obj=None):
        if not obj:
            # the changelist itself
            print('query change')
            return True # So they can see the change list page
        return obj.user == request.user or request.user.is_superuser


class CampaignAdmin(FilterUserAdmin):
   ...

这就是我的代码的样子。 存钱就好了。 但是,其他用户在他们的广告系列列表中看到了模型广告系列, 尽管他们无法对其进行编辑。当非所有者的用户单击要编辑的活动时,会看到 403 禁止页面。

我不希望模型实例显示在其他用户的活动列表中。

【问题讨论】:

    标签: python django django-admin django-queryset


    【解决方案1】:

    您应该覆盖get_queryset,而不是queryset。该方法在 Django 1.6 中从 queryset 重命名为 get_queryset

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

    注意,检查if getattr(obj, 'user', None) is None:时不需要使用getattr,可以简化为if obj.user is None

    【讨论】:

      猜你喜欢
      • 2022-06-25
      • 2011-10-19
      • 2014-10-10
      • 2020-05-29
      • 2012-11-13
      • 2015-11-04
      • 2020-08-22
      • 2019-04-15
      相关资源
      最近更新 更多