name has python django django-admin django-permissions

python - has - django get user group name



Cómo verificar(en plantilla) si el usuario pertenece a un grupo (5)

¿Cómo comprobar en la plantilla si el usuario pertenece a algún grupo?

Es posible en una view que está generando la template pero ¿qué base.html si deseo verificar esto en base.html que es una plantilla extendida (no tiene su propia función de vista)?

Todas mis plantillas amplían base.html por lo que no es bueno revisarlas en cada view .

El base.html contiene la barra superior, que debe contener botones dependiendo de en qué group registra el usuario (clientes, vendedores).

En mi base.html es:

{% if user.is_authenticated %}

lo cual no es suficiente porque tengo que actuar de manera diferente a los usuarios de Customers y de los Sellers .

Así que lo que quiero es:

{% if user.in_group(''Customers'') %} <p>Customer</p> {% endif %} {% if user.in_group(''Sellers'') %} <p>Seller</p> {% endif %}


En su aplicación cree una carpeta ''templatetags''. En esta carpeta crea dos archivos:

__init__.py

auth_extras.py

from django import template from django.contrib.auth.models import Group register = template.Library() @register.filter(name=''has_group'') def has_group(user, group_name): group = Group.objects.get(name=group_name) return True if group in user.groups.all() else False

Debería verse así ahora:

app/ __init__.py models.py templatetags/ __init__.py auth_extras.py views.py

Después de agregar el módulo templatetags, deberá reiniciar su servidor antes de poder usar las etiquetas o los filtros en las plantillas.

En tu base.html (plantilla) usa lo siguiente:

{% load auth_extras %}

y para comprobar si el usuario está en el grupo "moderador":

{% if request.user|has_group:"moderator" %} <p>moderator</p> {% endif %}

Documentación: https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/


Necesita etiqueta de plantilla personalizada:

from django import template from django.contrib.auth.models import Group register = template.Library() @register.filter(name=''has_group'') def has_group(user, group_name): group = Group.objects.get(name=group_name) return group in user.groups.all()

En su plantilla:

{% if request.user|has_group:"mygroup" %} <p>User belongs to my group {% else %} <p>User doesn''t belong to mygroup</p> {% endif %}

Fuente: http://www.abidibo.net/blog/2014/05/22/check-if-user-belongs-group-django-templates/

Docs: https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/


Observe que obtendrá una excepción si el grupo no existe en la base de datos.

La etiqueta de plantilla personalizada debe ser:

from django import template from django.contrib.auth.models import Group register = template.Library() @register.filter(name=''has_group'') def has_group(user, group_name): try: group = Group.objects.get(name=group_name) except Group.DoesNotExist: return False return group in user.groups.all()

Su plantilla:

{% if request.user|has_group:"mygroup" %} <p>User belongs to my group {% else %} <p>User doesn''t belong to mygroup</p> {% endif %}


Yo diría que la mejor manera es:

yourapp / templatetags / templatetagname.py

from django import template register = template.Library() @register.filter(name=''has_group'') def has_group(user, group_name): return user.groups.filter(name=group_name).exists()

yourapp / templates / yourapp / yourtemplate.html:

{% if request.user|has_group:"mygroup" %} <p>User belongs to my group {% else %} <p>User doesn''t belong to mygroup</p> {% endif %}


En tu plantilla

{% ifequal user.groups.all.0.name "user" %} This is User {% endifequal %}