我在扩展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,)
但它有同样的效果。
有没有解决方案?
也许这不是实现目标的正确方法?
答案 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设置过程中创建了一个实例,然后用于为所有后续请求提供服务。