Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django管理员,changelist_视图,ModelAdmin看起来像一个单例_Django_Django Admin - Fatal编程技术网

Django管理员,changelist_视图,ModelAdmin看起来像一个单例

Django管理员,changelist_视图,ModelAdmin看起来像一个单例,django,django-admin,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:

我在扩展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,)
目标是根据用户(主管或非主管)动态更改列表显示

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

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

取消对行的注释很有效,但我一点也不喜欢。 在我看来,它就像一个单身汉

我还尝试改为:

 super(MakeModelAdmin, self).changelist_view(request, extra_context=extra_context,)
但它也有同样的效果

有什么解决办法吗

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

根据请求动态更改管理员行为的方法是使用
get.*
方法。在您的情况下,这将类似于:

def get_list_display(self, request):
    if request.user.is_superuser:
        return ['company', 'name']
    else:
        return super().get_list_display(request)
至于
AdminSite
,它不是一个单一实例(也就是说,不是每次实例化时都返回相同的实例)。只是在Django安装过程中创建了一个实例,然后用于服务所有后续请求。

根据请求动态更改管理员行为的方法是使用
get.*
方法。在您的情况下,这将类似于:

def get_list_display(self, request):
    if request.user.is_superuser:
        return ['company', 'name']
    else:
        return super().get_list_display(request)
至于
AdminSite
,它不是一个单一实例(也就是说,不是每次实例化时都返回相同的实例)。只是在Django安装过程中创建了一个实例,然后用于服务所有后续请求