Django管理员,changelist_视图,ModelAdmin看起来像一个单例
我在扩展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:
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安装过程中创建了一个实例,然后用于服务所有后续请求