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