Django admin,如何在 django 模板中正确检查用户的权限?
Posted
技术标签:
【中文标题】Django admin,如何在 django 模板中正确检查用户的权限?【英文标题】:Django admin, how to check properly user's permission in django template? 【发布时间】:2013-12-26 03:34:55 【问题描述】:这里是新手。我的应用程序名称是 ccad。型号名称为 logbook。用户 A 没有从可用用户权限中编辑、添加或删除日志模型的权限。
所以我尝试隐藏保存、保存并继续编辑、保存并从用户 A 添加另一个按钮。
我遵循了我在 SO 中找到的建议。 Here's 来自 Sid 回答的 picomon 查询。还有daniel the same inquiry。
我最终将以下代码写入我的模板。
change_form.html 位于 template folder/admin/app_name/model_name/
% if perms.ccad.add_logbook %
<li><input type="submit" value="% trans 'Save ' %" class="grp-button grp-default" name="_save" onclick_attrib /></li>
<li><input type="submit" value="% trans 'Save and add another' %" class="grp-button" name="_addanother" onclick_attrib /></li>
<li><input type="submit" value="% trans 'Save and continue editing' %" class="grp-button" name="_continue" onclick_attrib /></li>
% endif %
但是没有权限的用户仍然可以看到我提到的按钮。
我也尝试将% if perms.ccad.add_logbook %
更改为% if perms.ccad.can_add_logbook %
,但无济于事。
最好的方法是什么?
【问题讨论】:
【参考方案1】:首先检查模板上下文中的 perms 变量。在模板可见的某处添加... perms ...
。它应该像这样呈现...<django.contrib.auth.context_processors.PermWrapper object at X>...
。
如果不是这种情况,则您缺少模板中的权限。
验证您的设置TEMPLATE_CONTEXT_PROCESSORS
元组是否包含django.contrib.auth.context_processors.auth
。
同时确保在渲染模板时使用RequestContext
而不是Context
。
如果您最终看到 PermWrapper 但您的权限检查仍然不起作用,请将之前的调试更改为 ... perms.ccad ...
。
这应该输出类似于“set([u'ccad.add_...',...]) 的内容。
如果不是,那么您的应用可能不会被称为ccad
。
最后,在创建 if 条件之前,请确保权限返回一些内容 `... perms.ccad.add_logbook ...´。这应该返回 True 或 False。
现在我已经到了最后,我注意到您的问题是相反的,到目前为止我写的所有内容都是无用的。 :)
将 user.is_superuser
添加到您的模板中。如果其为 True,则当前用户具有超级用户权限,即使 perms.omg.can_facepalm
也始终返回 True
【讨论】:
我未能将 TEMPLATE_CONTEXT_PROCESSORS 放在我的 settings.py 上,而且我正在使用我的超级用户帐户来测试模板TEMPLATE_CONTEXT_PROCESSORS
有一个默认列表。我认为django.contrib.auth.context_processors.auth
在该列表中以上是关于Django admin,如何在 django 模板中正确检查用户的权限?的主要内容,如果未能解决你的问题,请参考以下文章
Django Admin Cookbook-8如何在Django admin中优化查询
Django Admin Cookbook-23如何在Django admin中添加嵌套的内联
Django Admin Cookbook-14如何在Django Admin后台移除“删除所选”操作