同一模型的多个Django管理页面版本
在我的Django后台管理界面中,我想根据当前登录的用户类型显示不同版本的管理页面。我想到了一些方法,但还没弄清楚怎么实现。
也许我可以在admin.ModelAdmin中加入一些逻辑,查看当前用户,然后动态地改变'排除'字段。这样可行吗?或者根据登录的用户使用不同的自定义模板,让模板根据需要包含或排除某些字段。
我可以为每种用户类型注册两个版本的admin.ModelAdmin类,也许通过权限来限制访问?但是权限系统似乎是基于每个模型类只允许一组权限,所以我不太确定怎么改变这个。
我可以抓取一些在渲染管理页面模板时使用的小部件,然后把它们放到我自己的页面中,这样强大的用户就能完成我需要的特定工作。
我可以设置多个AdminSites,并通过网址/视图系统限制访问。但我不太确定如何将不同的admin.ModelAdmin类注册到不同的AdminSites。
如果有任何建议,我会很感激。
回答
谢谢你的提示。下面是我怎么做的……
def get_form(self, request, obj=None, **kwargs):
"""This dynamically inserts the "owners" field into the exclude list
if the current user is not superuser.
"""
if not request.user.is_superuser:
if self.exclude:
self.exclude.append('owners')
else:
self.exclude = ['owners']
else:
# Necessary since Admin objects outlive requests
try:
self.exclude.remove('owners')
except:
pass
return super(OwnersModelAdmin,self).get_form(request, obj=None, **kwargs)
1 个回答
1
在ModelAdmin
这个类里,有很多可以用的“钩子”,可以帮助你处理这类事情。
其中一个方法是重写get_form
这个函数。这个函数会接收请求和正在编辑的对象,所以你可以从中获取当前用户的信息,并根据用户的不同返回不同的表单。
建议你看看ModelAdmin
的源代码,它在django.contrib.admin.options里,看看重写这个函数或者其他函数是否能满足你的需求。