web-dev-qa-db-fra.com

Comment vérifier (dans le modèle) si l'utilisateur appartient à un groupe

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

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/

48
mishbah

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/

12
fuser60596

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.

8
Alex K.

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

Dans votre modèle

{% ifequal user.groups.all.0.name "user" %}
  This is User
{% endifequal %}
  
3
Jaroslav Hájek