我可以在Django的模板中使用Auth应用程序的权限检查吗? (我想在特权用户的模板末尾显示一个简单的表单)
更重要的是,我应该这样做还是不是“Django方式”?
答案 0 :(得分:153)
如果您要检查模板中的权限,以下代码就足够了:
{% if perms.app_label.can_do_something %}
<form here>
{% endif %}
其中模型是指用户需要权限才能查看表单的模型。
有关更多示例,请参阅https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions。
当前登录用户的权限存储在模板变量
中{{ perms }}
(这需要启用以下上下文处理器:django.contrib.auth.context_processors.auth
)
答案 1 :(得分:2)
如果您需要更多粒度检查权限(例如,在特定对象上),请查看此扩展程序:http://django-authority.readthedocs.org/en/latest/check_templates/
答案 2 :(得分:1)
另一种独特的方法是:
{% if 'app_label.permission' in perms %}
<form here>
{% endif %}
示例:
{% if 'auth.view_group' in perms %}
<p> Hello World! </p>
{% endif %}
当您想使用默认/自定义身份验证权限时,无论您是否为模型创建了应用程序,这都会派上用场,因为此方法不需要应用程序名称。它只需要您的权限表中的权限名称。
您也可以使用和/或命令进行多项检查:
{% if 'auth.view_group' in perms and 'auth.add_group' in perms %}
<form here>
{% endif %}
答案 3 :(得分:0)
在Django 2.0及更高版本上测试
如果要查看登录用户所拥有的所有权限,请在模板(.html)上, 打印:
{{ perms.app_name }}
或
{{ perms }}
要检查用户是否具有权限,请使用:
{% if perms.app_name.change_model_name_lower_cased %}
例如:
{% if perms.Utilization.change_invoice %}
此处:利用率是我的应用名称。发票是型号名称。
请注意,通常会有4种权限:
此外,如果您要查看用户由于其所属的组而拥有的所有权限,请启动Django shell ...
user = User.objects.get(username='somename')
user.get_group_permissions()
此处列出的所有权限归因于他所属的组。
答案 4 :(得分:0)
很抱歉“发掘”这篇文章,但我有一个与权限有关的问题 看到我的帖子:Django: logic not well applied in template using permissions (perm
阿林丹(Arindam)对这个概念非常满意,我希望他或其他人可以帮助我
即使值正确,电费也不适用 当我在模板中寻找{{perms}}时,它返回一个对象,但没有权限列表 如果我寻找{{perms.randomization.can_randomize}},则返回False(或True),这是一个很好的值 我的应用名为“随机化”,我在我的随机化应用的一部分的“随机化”模型(使用元数据)中定义了can_randomize权限
我检查settings.py,但所有接缝都没问题
答案 5 :(得分:0)
对于那些使用 Jinja 模板并在这个问题上苦苦挣扎的人,就像我做了几个小时/几天一样......
request
对象:# in settings.py
TEMPLATES = [
{
"BACKEND": "django.template.backends.jinja2.Jinja2",
'DIRS': ['jinja2'],
"APP_DIRS": True,
"OPTIONS": {
'environment': 'main.jinjaconfig.env.environment',
}
},
# Other template backends...
]
# main/jinjaconfig/env.py
from django.template.context_processors import request
from jinja2 import Environment
# ...
def environment(**options):
env = Environment(**options)
# Update globals with the functions and objects you need, here 'request'
env.globals.update({
'request': request,
# Other globals like 'static', 'url', ...
})
return env
request
对象,以及 request.user
和 request.user.has_perm()
以及所有与用户相关的功能:{% if request.user.has_perm('app_label.can_do_something') %}
{# Stuff .. #}
{% endif %}