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 ?

234voto

Charlesthk Points 361

Votre Utilisateur est lié à l'objet Groupe par le biais d'un ManyToMany relation.

Vous pouvez ainsi appliquer le filtre pour groupes d'utilisateurs .

Ainsi, pour vérifier si un utilisateur donné fait partie d'un certain groupe ("Membre" pour l'exemple), il suffit de faire ceci :

def is_member(user):
    return user.groups.filter(name='Member').exists()

Si vous voulez vérifier si un utilisateur donné appartient à plus d'un groupe donné, utilisez la fonction Je n'ai rien fait. opérateur comme suit :

def is_in_multiple_groups(user):
    return user.groups.filter(name__in=['group1', 'group2']).exists()

Notez que ces fonctions peuvent être utilisées avec l'option @user_passes_test pour gérer l'accès à vos vues :

from django.contrib.auth.decorators import login_required, user_passes_test
@login_required
@user_passes_test(is_member) # or @user_passes_test(is_in_multiple_groups)
def myview(request):
    # Do your processing

J'espère que cela vous aidera

4 votes

Je ne suis pas sûr du fonctionnement interne de l'accès à la base de données de Django, mais cela semble beaucoup plus efficace que certaines des autres suggestions, comme rassembler tous les utilisateurs dans un groupe et faire un python standard user in groups (ou vice versa).

1 votes

Ne devez-vous pas ajouter .exists() à la fin pour retourner un booléen ? Sinon, is_member() et is_in_multiple_groups() retournera un QuerySet ce qui peut ne pas donner le résultat souhaité.

4 votes

Selon la documentation de Django, il est en effet plus rapide d'utiliser exists() puisqu'il n'évalue pas le queryset : docs.djangoproject.com/en/dev/ref/models/querysets/#exists

136voto

miku Points 63392

Vous pouvez accéder aux groupes simplement par le biais du groups l'attribut User .

from django.contrib.auth.models import User, Group

group = Group(name = "Editor")
group.save()                    # save this new group for this example
user = User.objects.get(pk = 1) # assuming, there is one initial user 
user.groups.add(group)          # user is now in the "Editor" group

puis user.groups.all() renvoie à [<Group: Editor>] .

Alternativement, et plus directement, vous pouvez vérifier si un utilisateur est dans un groupe par :

if django_user.groups.filter(name = groupname).exists():

    ...

Notez que groupname peut également être l'objet réel du groupe Django.

114 votes

La vérification réelle serait if user.groups.filter(name=group_name).count(): # do something

147 votes

Ou utiliser .exists() au lieu de .count()

3 votes

La question porte sur l'interrogation du modèle d'utilisateur pour les groupes auxquels il appartient, et non sur la façon de les instancier... -.-.

15voto

Mark Chackerian Points 1562

Si vous avez besoin de la liste des utilisateurs qui sont dans un groupe, vous pouvez faire ceci à la place :

from django.contrib.auth.models import Group
users_in_group = Group.objects.get(name="group name").user_set.all()

et ensuite vérifier

 if user in users_in_group:
     # do something

pour vérifier si l'utilisateur est dans le groupe.

5 votes

Cette méthode n'est pas adaptée aux sites comptant plus d'un petit nombre d'utilisateurs, car elle charge en mémoire de grands sous-ensembles de tables d'utilisateurs à chaque exécution.

1 votes

user.groups.filter(name="group name").exists() devrait fonctionner correctement. La solution que vous avez écrite utilise deux requêtes et n'est donc pas très optimale.

0 votes

Comme il est dit, "si vous avez besoin de la liste des utilisateurs qui sont dans un groupe"...

15voto

David Kühner Points 491

Si vous n'avez pas besoin de l'instance utilisateur sur place (comme c'était mon cas), vous pouvez le faire avec

User.objects.filter(pk=userId, groups__name='Editor').exists()

Cela ne produira qu'une seule requête à la base de données et retournera un booléen.

11voto

CODEkid Points 156

L'appartenance ou non d'un utilisateur à un certain groupe peut être vérifiée dans les modèles de django à l'aide de :

{% if group in request.user.groups.all %} "some action" {% endif %}

2 votes

Cela ne fonctionne pas pour moi, il semble qu'il faille comparer le groupe avec le nom du groupe.

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