django - tutorial - Obtener grupo de usuarios en una plantilla
multiple user roles django (3)
Quiero mostrar un menú que cambia de acuerdo con 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 de menú mostrar ... Ya había hecho esta pregunta antes, pero mi lógica se estaba haciendo en la plantilla. Así que ahora lo quiero en mi opinión ... El menú se ve a continuación
<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>
Suponiendo que el usuario es la gerencia, lo verá todo ... Pero suponiendo que el usuario esté en las ventas del grupo, solo verá 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?
La forma estándar de Django de verificar los permisos es mediante los indicadores de permisos individuales en lugar de probar el nombre del grupo.
Si debe verificar los nombres de los grupos, teniendo en cuenta que Usuarios a grupos es una relación muchos a muchos, puede obtener el primer grupo de la lista de grupos en su plantilla con algo como esto:
{{ user.groups.all.0 }}
o usándolo así en un condicional (no probado pero debería funcionar):
{% ifequal user.groups.all.0 ''Sales'' %}
...
{% endif %}
Si elige el modelo de permiso preferido, 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
suponiendo que su aplicación se llama vehicle
y el modelo se llama Vehicle
.
Si el usuario es un superusuario, automáticamente tiene 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 está en 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 de muchos a muchos, por lo que no es realmente una buena idea usarlo como uno a muchos.
Crea un user_tags.py en tu aplicación / templatetags siguiendo 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, úsalo:
{% if request.user|has_group:"Administradores"%}
<div> Admins can see everything </div>
{% endif %}
user.groups.all.0.name == "groupname"