[英]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.