164 votes

Dans Django, comment vérifier si un utilisateur fait partie d'un certain groupe ?

J'ai créé un groupe personnalisé dans le site d'administration de Django.

Dans mon code, je veux vérifier si un utilisateur est dans ce groupe. Comment dois-je m'y prendre ?

10voto

Vous n'avez besoin que d'une ligne :

from django.contrib.auth.decorators import user_passes_test  

@user_passes_test(lambda u: u.groups.filter(name='companyGroup').exists())
def you_view():
    return HttpResponse("Since you're logged in, you can see this text!")

5 votes

Ce n'est pas du code très propre, et pas très réutilisable, mais +1 pour l'avoir mis en une ligne.

3voto

Branko Radojevic Points 428

J'ai une situation similaire, je voulais tester si l'utilisateur est dans un certain groupe. J'ai donc créé un nouveau fichier utils.py dans lequel je place tous mes petits utilitaires qui m'aident dans toute l'application. Là, j'ai cette définition :

utils.py

def is_company_admin(user):
    return user.groups.filter(name='company_admin').exists()

donc en fait je teste si l'utilisateur est dans le groupe entreprise_admin et pour plus de clarté, j'ai appelé cette fonction est_company_admin .

Lorsque je veux vérifier si l'utilisateur se trouve dans la section entreprise_admin Je fais juste ça :

views.py

from .utils import *

if is_company_admin(request.user):
        data = Company.objects.all().filter(id=request.user.company.id)

Maintenant, si vous souhaitez tester la même chose dans votre modèle, vous pouvez ajouter est_utilisateur_admin dans votre contexte, quelque chose comme ça :

views.py

return render(request, 'admin/users.html', {'data': data, 'is_company_admin': is_company_admin(request.user)})

Vous pouvez maintenant évaluer votre réponse dans un modèle :

users.html

{% if is_company_admin %}
     ... do something ...
{% endif %}

Solution simple et propre, basée sur les réponses que l'on peut trouver plus tôt dans ce fil, mais faite différemment. J'espère que cela aidera quelqu'un.

Testé dans Django 3.0.4.

0 votes

Dans votre data = Company.objects.all().filter(id=request.user.company.id) que signifie la société ? Est-ce votre modèle ?

0 votes

Oui @hayden, dans ce cas, la société est mon modèle.

1voto

sjcipher Points 2626

Juste au cas où vous voudriez vérifier que le groupe de l'utilisateur appartient à une liste de groupes prédéfinis :

def is_allowed(user):
    allowed_group = set(['admin', 'lead', 'manager'])
    usr = User.objects.get(username=user)
    groups = [ x.name for x in usr.groups.all()]
    if allowed_group.intersection(set(groups)):
       return True
    return False

0voto

Trung Lê Points 11

User.objects.filter(username='tom', groups__name='admin').exists()

Cette requête vous informera si l'utilisateur : "tom" appartient au groupe "admin" ou non.

0 votes

Groupes__nom avec double soulignement

0voto

Harry Moreno Points 1254

Je l'ai fait comme ça. Pour le groupe nommé Editor .

# views.py
def index(request):
    current_user_groups = request.user.groups.values_list("name", flat=True)
    context = {
        "is_editor": "Editor" in current_user_groups,
    }
    return render(request, "index.html", context)

modèle

# index.html
{% if is_editor %}
  <h1>Editor tools</h1>
{% endif %}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X