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