Django queryset筛选不起作用

2024-06-26 10:39:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望管理员用户只看到他们创建的模型实例。我遵循了这些指示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个禁止页面。在

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


Tags: the用户模型selfnoneobjreturnif
1条回答
网友
1楼 · 发布于 2024-06-26 10:39:46

您应该重写^{},而不是{}。在django1.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。在

相关问题 更多 >