我试图在Django管理列表视图中为不同的用户显示不同的字段(我猜它叫做changelist)。 Django为非超级用户显示正确的字段集,但在超级用户的字段集之间切换。
我有一个超级用户和非超级用户,在perm1
中定义的模型上有自定义权限some_app
。权限通过组在非超级用户上设置。
下面是我用来根据用户切换list_display
的代码。
def changelist_view(self, request, **kwargs):
user = request.user
if user.has_perm('some_app.perm1'):
self.list_display = (
'field1',
'field2',
)
make_log('non-super user')
else:
self.list_display = (
'field1',
'field2',
'field3',
'field4',
)
make_log('superuser')
return super(CustomAdmin, self).changelist_view(request, **kwargs)
我在课堂定义中尝试过使用和不使用list_display
。没有不同。
Django根据谁访问该视图正确输出日志(make_log()
)。但几乎有一半的时间Django向非超级用户显示超级用户字段集。并且它始终为具有权限perm1
的用户显示正确的字段集。
我也尝试使用if not user.is_superuser and user.has_perm('some_app.perm1')
作为条件也没有区别。我猜超级用户可以做他们想做的一切,但根据Django没有权限。
我究竟做错了什么?
更新(感谢@dirkgroten):
假设超级用户没有权限,假设some_superuser.has_perm('some_app.perm1')
返回True
,即使未明确为此超级用户设置权限(直接或通过组)
这是因为Django查看类list_display而不是实例list_display。要拥有动态list_display,请覆盖ModelAdmin.get_list_display
https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_list_display