Skip to main content
 首页 » 编程设计

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

2025年05月04日26JeffreyZhao

在我的 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) 

请您参考如下方法:

ModelAdmin 类中为这类事情提供了很多钩子(Hook)。

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

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