Comment vérifier dans le modèle si l'utilisateur appartient à un groupe?
C'est possible dans un view
qui génère le template
mais que faire si je veux vérifier cela dans base.html
qui est un modèle d'extension (il n'a pas sa propre fonction d'affichage)?
Tous mes modèles s'étendent base.html
donc il n'est pas bon de le vérifier dans chaque view
.
Le base.html
contient la barre supérieure, qui devrait contenir des boutons selon dans lequel group
l'utilisateur connecté est (Clients, Vendeurs).
Dans mon base.html
est:
{% if user.is_authenticated %}
ce qui n'est pas suffisant car je dois agir différemment des utilisateurs de Customers
et des utilisateurs de Sellers
.
Donc ce que je veux c'est:
{% if user.in_group('Customers') %}
<p>Customer</p>
{% endif %}
{% if user.in_group('Sellers') %}
<p>Seller</p>
{% endif %}
Vous avez besoin d'une balise de modèle personnalisée:
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()
Dans votre modèle:
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group
{% else %}
<p>User doesn't belong to mygroup</p>
{% endif %}
Source: http://www.abidibo.net/blog/2014/05/22/check-if-user-belongs-group-Django-templates/
Documents: https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/
Dans votre application, créez un dossier "templatetags". Dans ce dossier, créez deux fichiers:
__ 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
Cela devrait ressembler à ceci maintenant:
app/
__init__.py
models.py
templatetags/
__init__.py
auth_extras.py
views.py
Après avoir ajouté le module templatetags, vous devrez redémarrer votre serveur avant de pouvoir utiliser les balises ou les filtres dans les modèles.
Dans votre base.html (modèle), utilisez ce qui suit:
{% load auth_extras %}
et pour vérifier si l'utilisateur est dans le groupe "modérateur":
{% if request.user|has_group:"moderator" %}
<p>moderator</p>
{% endif %}
Documentation: https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/
Je dirais que la meilleure façon est:
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:
{% load has_group %}
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group
{% else %}
<p>User doesn't belong to mygroup</p>
{% endif %}
EDIT: ligne ajoutée avec le chargement des balises de modèle comme indiqué dans les commentaires.
Attention, vous obtiendrez une exception si le groupe n'existe pas dans la base de données.
La balise de modèle personnalisé doit être:
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()
Votre modèle:
{% if request.user|has_group:"mygroup" %}
<p>User belongs to my group
{% else %}
<p>User doesn't belong to mygroup</p>
{% endif %}
Dans votre modèle
{% ifequal user.groups.all.0.name "user" %}
This is User
{% endifequal %}