Django管理员在变更列表中显示错误的list_display

时间:2019-04-09 09:48:54

标签: python django django-admin

我正在尝试在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") } }) } ,所以认为超级用户没有权限是不正确的。

1 个答案:

答案 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