Получить группу пользователей в шаблоне
Я хочу отобразить меню, которое изменяется в соответствии с группой пользователей текущего пользователя, с этой логикой, находящейся внутри моего представления, а затем установите переменную для проверки в шаблоне, чтобы определить, какие пункты меню должны отображаться.... Я задавал этот вопрос раньше, но моя логика делалась в шаблоне. Так что теперь я хочу это на мой взгляд... Меню выглядит как ниже
<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>
Предполагая, что пользователь - это управление, они увидят все... Но если предположить, что пользователь входит в группу продаж, они будут видеть только первые два и два последних элемента... и так далее. Я также хочу динамическое перенаправление после входа в систему на основе группы пользователей. Любые идеи?
Ответы
Ответ 1
Стандартный способ проверки прав доступа 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.
Для вашего другого вопроса переадресуйте логин на основе группы пользователей: "Пользователи для групп" - это отношения "многие-ко-многим", поэтому не рекомендуется использовать его как "один ко многим".
Ответ 2
Создайте 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 %}
Ответ 3
user.groups.all.0.name == "groupname"