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

2 投票
1 回答
997 浏览
提问于 2025-04-16 04:46

在我的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里,看看重写这个函数或者其他函数是否能满足你的需求。

撰写回答