同一模型的Django管理页面的多个版本
问题描述:
在我的django管理部分,我想显示不同版本的管理页面,取决于当前登录的用户类型。我可以想到几种方法可能工作,但还没有想出如何做任何他们。同一模型的Django管理页面的多个版本
也许我可以把逻辑放入admin.ModelAdmin来查看当前用户并动态改变'exclude'字段。那样有用吗?或者,也可以根据登录的用户运行不同的自定义模板,并根据需要使模板包含/排除字段。
我可以注册admin.ModelAdmin类的两个版本,每种类型的用户都有一个版本,并且可能通过权限限制访问权限?但是权限系统似乎深信每个模型类的一组权限,所以我不知道如何改变它。
我可以抓住一些用于呈现管理页面模板的小部件,并将它们包含在我自己的页面中,这样做是我需要强大用户才能完成的一项特定工作。
我可以设置多个AdminSites并通过url/view系统限制对它们的访问。但后来我不知道如何注册不同AdminSites的不同Admin.ModelAdmin类。
任何意见,将不胜感激。
回答
谢谢你的提示。以下是我做到了......
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)
答
有在ModelAdmin
类这样的事情提供了不少挂钩。
一种可能性是重写get_form
方法。这将接受请求以及正在编辑的对象,以便您可以从那里获取当前用户,并根据用户返回不同的ModelForms。
值得看看ModelAdmin
的来源 - 它在django.contrib.admin.options - 看看覆盖这个或任何其他方法是否可以满足您的需求。
谢谢。这有帮助。我在上面的问题中包含了我的代码以供参考。 – Leopd 2010-09-29 18:52:28