【问题标题】:Check permission inside a template in Django在 Django 中检查模板内的权限
【发布时间】:2012-03-17 04:41:57
【问题描述】:

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

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

【问题讨论】:

标签: django django-authentication


【解决方案1】:

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

{% 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.app_label.foobar 将始终为真,即使您拼错了权限名称。
  • 这里还要注意“can_do_something”是权限的名称,所以不需要在权限名称前加上前缀“can”。例如,perms.my_app.add_object
【解决方案2】:

在 Django 2.0 + 上测试

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

{{ perms.app_name }}

或者

{{ perms }}

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

{% if perms.app_name.change_model_name_lower_cased %}

例如:

{% if perms.Utilization.change_invoice %}

这里: Utilization 是我的应用名称。发票是型号名称。

注意,一般会有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()

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

【讨论】:

  • 是的。真的:小写。不是snake_cased。使用 {{perms}} 查看权限的想法很棒,所以我认为这是最好的答案。
【解决方案3】:

如果您需要更精细地检查权限(例如在特定对象上),请查看此扩展:http://django-authority.readthedocs.org/en/latest/check_templates/

【讨论】:

    【解决方案4】:

    另一种独特的方法是:

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

    【讨论】:

      【解决方案5】:

      对于那些使用 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 %}
      

      【讨论】:

        猜你喜欢
        • 2014-05-23
        • 2018-10-04
        • 2013-06-02
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 2017-09-10
        相关资源
        最近更新 更多