同一模型的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 - 看看覆盖这个或任何其他方法是否可以满足您的需求。

+0

谢谢。这有帮助。我在上面的问题中包含了我的代码以供参考。 – Leopd 2010-09-29 18:52:28