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

问题描述 投票:0回答:1

我试图在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,即使未明确为此超级用户设置权限(直接或通过组)

python django django-admin
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.