Django admin,changelist_view,ModelAdmin似乎就像一个单身人士

时间:2018-03-12 06:04:04

标签: django django-admin

我在扩展ModelAdmin时发现了一个奇怪的行为。 我有这段代码:

class MakeModelAdmin(admin.ModelAdmin):

    ...

    def changelist_view(self, request, extra_context=None):
        if request.user.is_superuser:
            self.list_display = ['company', 'name']
        # else:
        #    self.list_display = ['name']
        return super().changelist_view(request, extra_context=extra_context,)

目标是根据用户(主管或非主管)动态更改list_display

我在两个不同的浏览器中登录两个不同的用户,其中一个是超级用户,另一个不是。

self.list_display由一个用户设置,但是与另一个用户调试请求我可以看到变量仍然设置,因此它改变了另一个用户视图的下一个行为。

取消注释它的工作线但我根本不喜欢它。 在我看来,它就像一个单身人士。

我也试图改为:

 super(MakeModelAdmin, self).changelist_view(request, extra_context=extra_context,)

但它有同样的效果。

有没有解决方案?

也许这不是实现目标的正确方法?

1 个答案:

答案 0 :(得分:2)

根据请求动态更改管理员行为的documented方法是使用get_*方法。在你的情况下,这将是:

def get_list_display(self, request):
    if request.user.is_superuser:
        return ['company', 'name']
    else:
        return super().get_list_display(request)

对于AdminSite,它不是单例(也就是说,每次实例化时都不会返回相同的实例)。它只是在Django设置过程中创建了一个实例,然后用于为所有后续请求提供服务。