在Django中检查模板内的权限


90

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

更重要的是,我是否应该这样做,或者这不是“ Django方式”吗?


对于后来像我这样偶然发现的人,Django 1.5的链接已稍作更改。现在可以在此URL的docs中找到该信息:docs.djangoproject.com/en/1.5/topics/auth/default/#permissions原始答案中的内容没有真正改变,但这只是一个新URL :)
Xudonax

Answers:


187

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

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


14
请注意,如果您以超级用户身份登录perms.app_label.foobar,即使您拼错了权限名称,也将始终为true。
Flimm

2
还要注意,“ can_do_something”是权限的名称,因此您无需在权限名称中添加前缀“ can”。例如,perms.my_app.add_object
Karim Sonbol

11

在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()

这里列出的所有权限归因于他所属的组。


1
是。真的:小写。没有snake_cased。用{{perms}}查看权限的想法很棒,所以我认为这是最好的答案。
mirek


0

抱歉,“发掘”这篇文章,但我有一个与权限相关的问题,请参阅我的文章:Django:使用权限(perm)在模板中无法很好地应用逻辑

因为Arindam对这个概念非常满意,我希望他或其他人可以帮助我

当我在模板中寻找{{perms}}时,即使值是正确的,烫发也不适用。如果我寻找{{perms.randomization.can_randomize}},它返回False(或True),则返回对象,但权限列表不适用),这就是我的应用程序名为randomization的良好价值,并且我在我的随机化应用程序的一部分的Randomization模型(使用meta)中定义了can_randomize权限

我检查settings.py但所有接缝都没问题


嗨,斯莱特。我今天才看到 显然为时已晚。但是,如果您想推荐某人以便他得到消息,请在此注释部分中在消息中添加一个@Name。
Arindam Roychowdhury
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.