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

Posted

技术标签:

【中文标题】同一模型的多个版本的 django 管理页面【英文标题】:Multiple versions of django admin page for the same model 【发布时间】:2011-04-18 23:26:35 【问题描述】:

在我的 django 管理部分,我想根据当前登录的用户类型显示不同版本的管理页面。我可以想到几种可行的方法,但还没有弄清楚如何做其中任何一个。

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

我可以注册两个版本的 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)

【问题讨论】:

【参考方案1】:

ModelAdmin 类为这类事情提供了很多钩子。

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

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

【讨论】:

谢谢。这有帮助。我将我的代码包含在上面的问题中以供参考。

以上是关于同一模型的多个版本的 django 管理页面的主要内容,如果未能解决你的问题,请参考以下文章

从 django 管理操作中间页面重定向到更改表单页面

使用 bootstrap 和 django 在同一页面内实现两个或多个选项卡面板

Django 应用程序未在管理页面中显示注册模型

Django管理员登录页面在正确的登录凭据上重定向到同一页面

如何通过 javascript 从管理页面检索 Django 模型 ID

Django将硬编码的href链接添加到管理模型的表单视图页面