Получить группу пользователей в шаблоне - PullRequest
15 голосов
/ 27 июня 2009

Я хочу отобразить меню, которое изменяется в зависимости от группы пользователей текущего пользователя, вошедшего в систему, с этой логикой, находящейся внутри моего представления, а затем установить переменную для проверки в шаблоне, чтобы определить, какие пункты меню отображать. ... Я задавал этот вопрос раньше, но моя логика была сделана в шаблоне. Так что теперь я хочу это на мой взгляд ... Меню выглядит как показано ниже

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

Предположим, что пользователь является менеджером, он увидит все ... Но, если пользователь участвует в групповых продажах, он увидит только первые два и два последних элемента ... и так далее. Я также хочу динамическое перенаправление после входа в систему на основе группы пользователей. Есть идеи?

Ответы [ 3 ]

27 голосов
/ 27 июня 2009

Стандартный способ проверки разрешений в Django - это использование отдельных флагов разрешений, а не проверка имени группы.

Если вам необходимо проверить имена групп, зная, что «Пользователи к группам» - это отношение «многие ко многим», вы можете получить группу first в списке групп в вашем шаблоне примерно так:

{{ user.groups.all.0 }}

или использовать его в условных выражениях (не проверено, но должно работать):

{% ifequal user.groups.all.0 'Sales' %}
   ...
{% endif %}

Если вы выберете предпочитаемую модель разрешений, вы сделаете что-то вроде следующего.

...

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

...

Это разрешения, автоматически созданные для вас syncdb при условии, что ваше приложение называется vehicle, а модель называется Vehicle.

Если пользователь является суперпользователем, он автоматически получает все разрешения.

Если пользователь входит в группу «Продажи», у него не будет этих разрешений для транспортных средств (если вы, конечно, не добавили их в группу).

Если пользователь входит в группу управления, он может иметь эти разрешения, но вам необходимо добавить их в группу на сайте администратора Django.

Что касается другого вопроса, перенаправьте при входе в систему на основе группы пользователей: «Пользователи к группам» - это отношение «многие ко многим», поэтому не стоит использовать их как «один ко многим».

10 голосов
/ 14 марта 2016

Создайте user_tags.py в своем приложении / templatetags, следуйте приведенным выше инструкциям:

# -*- 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

И, наконец, в шаблоне используйте его:

{% if request.user|has_group:"Administradores"%}
      <div> Admins can see everything </div>
{% endif %}
5 голосов
/ 13 июня 2013
user.groups.all.0.name == "groupname"
...