在Django模板中检查权限

125

我能否在Django模板中使用Auth应用程序的权限检查?(我想在模板末尾为特权用户显示一个简单的表单)

更重要的是,我是否应该这样做,还是这不是"Django way"?


1
对于像我这样后来者,Django 1.5的链接稍作更改。现在可以在此URL的文档中找到相关信息:https://docs.djangoproject.com/en/1.5/topics/auth/default/#permissions 原始答案中没有任何实质性变化,只是一个新的URL :) - Xudonax
5个回答

237

如果您想在模板中检查权限,以下代码就足够了:

{% 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


26
请注意,如果您以超级用户身份登录,则perms.app_label.foobar将始终为true,即使您拼写了权限名称也错了。 - Flimm
3
还要注意,“can_do_something”是权限的名称,因此您不需要在权限名称前添加前缀“can”。例如,perms.my_app.add_object。 - Karim Sonbol

27

在 Django 2.0+ 中测试通过

如果你想在模板(.html)中查看已登录用户拥有的所有权限,请打印:

{{ perms.app_name }}

或者

{{ perms }}

为了检查用户是否具有权限,请使用:

{% if perms.app_name.change_model_name_lower_cased %}

例如:

{% if perms.Utilization.change_invoice %}

这里:Utilization是我的应用程序名称,Invoice是模型名称。

请注意,通常有4种类型的权限:

  • 更改 [例如 Utilization.change_projectemail]
  • 查看 [例如 Utilization.view_invoice]
  • 删除 [例如 Utilization.delete_invoicetype]
  • 添加 [例如 Utilization.add_invoicetype]

另外,如果您想查看用户由于所属组而拥有的所有权限,请启动Django shell...

user = User.objects.get(username='somename')
user.get_group_permissions()

这里列出的所有权限都是由他所属的用户组决定的。


3
是的。真的:小写字母的形式。不是蛇形命名法。使用{{perms}}查看权限的想法很好,所以我认为这是最好的答案。 - mirek

7

还有一种独特的方法:

{% if 'app_label.permission' in perms %}
<form here>
{% endif %}

例子:

{% if 'auth.view_group' in perms %}
<p> Hello World! </p>
{% endif %}

当您想要使用默认/自定义身份验证权限时,此方法非常方便,无论您是否为模型创建了应用程序,因为此方法不需要应用程序名称。它只需要来自您的权限表的权限名称。

您也可以使用and/or命令进行多个检查:

{% if 'auth.view_group' in perms and 'auth.add_group' in perms %}
<form here>
{% endif %}

4

0

对于那些使用Jinja模板并且像我一样为此问题苦苦挣扎了几个小时/几天的人...

  1. 使用扩展的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
  1. 然后您可以在Jinja模板中访问request对象,以及request.userrequest.user.has_perm()和所有与用户相关的函数:
{% if request.user.has_perm('app_label.can_do_something') %}
  {# Stuff .. #}
{% endif %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接