在模板中获取用户组

15 django permissions menu dynamic

我想显示一个菜单,该菜单根据当前登录用户的用户组进行更改,此逻辑位于我的视图中,然后设置一个变量以检查模板以确定要显示的菜单项....之前我曾问过这个问题,但我的逻辑是在模板中完成的.所以现在我想在我看来......菜单如下所示

   <ul class="sidemenu">
    <li><a href="/">General List </a></li>
    <li><a href="/sales_list">Sales List </a></li>
    <li><a href="/add_vehicle">Add a New Record </a></li>
    <li><a href="/edit_vehicle">Edit Existing Record </a></li>
    <li><a href="/filter">Filter Records </a></li>
    <li><a href="/logout">Logout </a></li>
  </ul>
Run Code Online (Sandbox Code Playgroud)

支持用户是管理,他们会看到一切......但假设用户在群销售中,他们只会看到前两个和后两个......等等.我还希望在登录后根据用户的组进行动态重定向.有任何想法吗?

Van*_*ale 28

检查权限的标准Django方法是通过单独的权限标志,而不是测试组名.

如果您必须检查组名,请注意"用户到组"是多对多关系,您可以在模板的组列表中获取第一个组,如下所示:

{{ user.groups.all.0 }}
Run Code Online (Sandbox Code Playgroud)

或者在条件中使用它(未经测试但应该工作):

{% ifequal user.groups.all.0 'Sales' %}
   ...
{% endif %}
Run Code Online (Sandbox Code Playgroud)

如果您使用首选权限模型,您将执行以下操作.

...

  {% if perms.vehicle.can_add_vehicle %}
    <li><a href="/add_vehicle">Add a New Record </a></li>
  {% endif %}
  {% if perms.vehicle.can_change_vehicle %}
    <li><a href="/edit_vehicle">Edit Existing Record </a></li>
  {% endif %}

...
Run Code Online (Sandbox Code Playgroud)

这些是通过syncdb假设您的应用程序被调用vehicle并且调用模型而自动为您创建的权限Vehicle.

如果用户是超级用户,则他们自动拥有所有权限.

如果用户位于"销售"组中,则他们将不具有这些车辆权限(除非您已将这些权限添加到该组中).

如果用户在管理组中,他们可以拥有这些权限,但您需要将它们添加到Django管理站点中的组.

对于您的其他问题,请根据用户组重定向登录:用户到群组是多对多关系,因此将其用作一对多并不是一个好主意.

  • 但是这工作了user.groups.all.0.name =="groupname"我想在第一种情况下一个查询集和字符串被比较所以它不起作用? (3认同)
  • user.groups.all.0.name == "groupname" 是这里的正确用法。@rammanoj 值得为这个花絮提供一些支持。我还注意到结束标记需要是 endifequal,而不是 endif。 (2认同)

Luc*_*mon 10

在app/templatetags中创建一个user_tags.py,如上所示:

# -*- coding:utf-8 -*-
from __future__ import unicode_literals

# Stdlib imports

# Core Django imports
from django import template

# Third-party app imports

# Realative imports of the 'app-name' package


register = template.Library()


@register.filter('has_group')
def has_group(user, group_name):
    """
    Verifica se este usuário pertence a um grupo
    """
    groups = user.groups.all().values_list('name', flat=True)
    return True if group_name in groups else False
Run Code Online (Sandbox Code Playgroud)

最后在模板中使用它:

{% if request.user|has_group:"Administradores"%}
      <div> Admins can see everything </div>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

  • 只是不要忘记在模板中`{% load user_tags %}`。 (3认同)

Kis*_*war 7

user.groups.all.0.name == "groupname"
Run Code Online (Sandbox Code Playgroud)