2009-06-27 12 views
12

Quiero mostrar un menú que cambia según el grupo de usuarios del usuario actualmente conectado, con esta lógica dentro de mi vista, y luego establecer una variable para verificar en la plantilla para determinar qué elementos del menú mostrar ... He hecho esta pregunta antes, pero mi lógica se estaba haciendo en la plantilla. Así que ahora yo quiero que en mi opinión ... El menú parece que a continuaciónObtener grupo de usuarios en una plantilla

<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 la gestión de usuarios es, verán todo ... Pero suponiendo que el usuario se encuentra en las ventas del grupo, van a solo vea los dos primeros y los dos últimos elementos ... y así sucesivamente. También quiero una redirección dinámica después del inicio de sesión en función del grupo del usuario. ¿Algunas ideas?

Respuesta

19

La forma estándar de Django de comprobar los permisos es mediante los indicadores de permisos individuales en lugar de probar el nombre del grupo.

Si tiene que comprobar los nombres de grupo, siendo conscientes de que usuarios a los grupos es un muchos-a-muchos relación, se puede obtener el primer grupo en la lista de grupos en su plantilla con algo como esto:

{{ user.groups.all.0 }} 

o usarlo como este en un condicional (no probado pero debería funcionar):

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

Si vas con el modelo de permisos preferido que haría algo como lo siguiente.

... 

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

... 

Estos son los permisos creados automáticamente para usted por syncdb asumiendo que su aplicación se llama vehicle y el modelo se llama Vehicle.

Si el usuario es un superusuario, automáticamente tienen todos los permisos.

Si el usuario está en un grupo de Ventas, no tendrá esos permisos del vehículo (a menos que los hayas agregado al grupo por supuesto).

Si el usuario pertenece a un grupo de administración, puede tener esos permisos, pero debe agregarlos al grupo en el sitio de administración de Django.

Para su otra pregunta, redirija el inicio de sesión según el grupo de usuarios: Usuarios a grupos es una relación muchos a muchos, por lo que no es realmente una buena idea usarlo como uno a muchos.

3
user.groups.all.0.name == "groupname" 
9

Crear un user_tags.py en su aplicación/templatetags siguen arriba:

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

Y finalmente en la plantilla lo utilizan:

{% if request.user|has_group:"Administradores"%} 
     <div> Admins can see everything </div> 
{% endif %} 
+0

Pero no se olvide que '{% de carga user_tags%} 'en la plantilla. – zeridon

+0

¿cómo puedo usar este código para verificar si en groupA o groupB por ejemplo? – AlexW

Cuestiones relacionadas