在 Django 中检查模板内部的权限

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

更重要的是,我应该这么做吗还是这不是“姜戈的方式”?

83952 次浏览

如果希望检查模板中的权限,以下代码就足够了:

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

如果在检查 perms 时需要更多的粒度(例如在特定对象上) ,请检查这个扩展: http://django-authority.readthedocs.org/en/latest/check_templates/

在 Django 2.0 + 上测试

如果您希望查看登录用户在您的模板(. html)上拥有的所有权限, print :

\{\{ perms.app_name }}

或者

\{\{ perms }}

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

{% if perms.app_name.change_model_name_lower_cased %}

E.g :

{% if perms.Utilization.change_invoice %}

这里: 利用率是我的应用程序名,发票是一个模型名。

请注意,一般来说,将有4种权限:

  • Change [例如 Utilization.change _ projectemail ]
  • View [例如 Utilization.view _ 惹]
  • Delete [例如 Utilization.delete _ invicetype ]
  • Add [例如 Utilization.add _ invicetype ]

此外,如果希望查看用户由于所属组而拥有的所有权限,请启动 Django shell..。

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

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

另一个独特的方法是:

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

对于那些使用金贾模板并为这个问题苦苦挣扎的人,就像我花了几个小时/几天做的那样... ..。

  1. 使用扩展的 Jinja Environment,并向其添加 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. Then you can access the request object in Jinja templates, and also request.user and request.user.has_perm() and all user related functions:
{% if request.user.has_perm('app_label.can_do_something') %}
{# Stuff .. #}
{% endif %}