简体   繁体   English

Django查询集过滤不起作用

[英]Django queryset filtering not working

I want the admin users to see only the model instances they created. 我希望管理员用户只能看到他们创建的模型实例。 I followed these instructions Filter django admin by logged in user 我按照以下说明通过登录用户过滤django管理员

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):
   ...

This is how my code looks like. 这就是我的代码的样子。 Saving is fine. 保存很好。 However, other users are seeing the model campaign in their campaign list, though they were not able to edit it. 但是,其他用户无法编辑模型活动,但是他们在其活动列表中看到了该模型活动。 When a user, who is not the owner clicks the campaign to edit, 403 Forbidden page is seen. 如果不是所有者的用户单击广告系列进行编辑,则会看到“ 403禁止访问”页面。

I don't want the model instance to be shown in the other users' campaign list. 我不希望将模型实例显示在其他用户的广告系列列表中。

You should override get_queryset , not queryset . 您应该覆盖get_queryset ,而不是queryset The method was renamed from queryset to get_queryset in Django 1.6. 在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)

Note that you do not need to use getattr when checking if getattr(obj, 'user', None) is None: , you can simplify it to if obj.user is None . 请注意,在检查if getattr(obj, 'user', None) is None:时,无需使用getattr if getattr(obj, 'user', None) is None:可以将其简化为if obj.user is None

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM