我正在尝试在Django管理员列表视图中为不同的用户显示不同的字段(我想它称为变更列表)。 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
和不使用make_log()
。没什么。
Django会根据谁访问该视图正确输出日志(perm1
)。但是Django几乎有一半的时间向超级用户显示供非超级用户使用的字段集。并且始终会向if not user.is_superuser and user.has_perm('some_app.perm1')
权限的用户显示正确的字段集。
我也尝试使用some_superuser.has_perm('some_app.perm1')
作为条件,也没有区别。我猜超级用户可以做他们想做的所有事情,但根据Django却没有权限。
我在做什么错了?
UPDATE(感谢@dirkgroten):
从某种意义上说,即使没有明确(直接或通过组)为此超级用户设置权限,True
仍会返回 private fun searchCustomer(param: String) {
var listOfCustomer = ArrayList<LocalCustomer>()
localCustomerRepository.searchLocalCustomers(param).observe(this,
Observer<List<LocalCustomer>> { localCustomerList ->
listOfCustomer = localCustomerList as ArrayList
if (listOfCustomer.size > 0) {
val locationAdapter = CustomerAdapter(context, listOfCustomer)
setupPopupWindow(listOfCustomer)
} else {
Utils.showMsg(this, "No result found")
}
})
}
,所以认为超级用户没有权限是不正确的。
答案 0 :(得分:1)
这是因为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