2009-06-27 4 views
12

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

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

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

ответ

19

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

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

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

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

9

Создать 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 %} 
+0

Только не забудьте '{% нагрузки user_tags%} 'в шаблоне. – zeridon

+0

Как я могу использовать этот код для проверки, например, в группе GroupA или groupB? – AlexW

Смежные вопросы