同一型号的django管理页面的多个版本

时间:2010-09-29 17:58:51

标签: python django django-admin

在我的django管理部分,我想显示管理页面的不同版本,具体取决于当前登录的用户类型。我可以想到这可能有多种用途,但还没弄明白如何做任何一件事。

也许我可以将逻辑放入admin.ModelAdmin来查看当前用户并动态更改'exclude'字段。那样有用吗?或者根据登录的人员运行不同的自定义模板,并让模板根据需要包含/排除字段。

我可以注册两个版本的admin.ModelAdmin类,每个类型一个用户,并且可能通过权限限制访问?但权限系统似乎相当深信每个模型类的一组权限,所以我不确定如何改变它。

我可以抓住几个用于渲染管理页面模板的小部件,并将它们包含在我自己的页面中,这个页面执行我需要强大的用户才能完成的一项特定工作。

我可以设置多个AdminSite并通过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)

1 个答案:

答案 0 :(得分:1)

ModelAdmin类提供了很多钩子来处理这类事情。

一种可能性是覆盖get_form方法。这将获取请求以及正在编辑的对象,因此您可以从那里获取当前用户,并返回依赖于用户的不同ModelForms。

值得查看ModelAdmin的来源 - 它位于django.contrib.admin.options中 - 看看是否覆盖此方法或任何其他方法可能满足您的需求。