检查Django中模板内的权限

时间:2012-02-27 17:44:07

标签: django django-authentication

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

更重要的是,我应该这样做还是不是“Django方式”?

6 个答案:

答案 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种权限:

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

此外,如果您要查看用户由于其所属的组而拥有的所有权限,请启动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 模板并在这个问题上苦苦挣扎的人,就像我做了几个小时/几天一样......

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