web-dev-qa-db-fra.com

Dans Django, comment vérifier si un utilisateur appartient à un certain groupe?

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

Dans mon code, je veux vérifier si un utilisateur est dans ce groupe. Comment je fais ça?

127
TIMEX

Vous pouvez accéder aux groupes simplement via l'attribut groups de 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

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

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

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

    ...

Notez que groupname peut aussi être le réel Django Objet de groupe.

93
miku

Votre objet tilisateur est lié à l'objet Groupe par l'intermédiaire d'une relation ManyToMany.

Vous pouvez ainsi appliquer la méthode filtre à ser.groups.

Donc, pour vérifier si un utilisateur donné appartient à un certain groupe ("Membre" pour l'exemple), procédez comme suit:

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 l'opérateur __ in 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 le décorateur @ 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 cette aide

186
Charlesthk

Si vous n'avez pas besoin de l'instance d'utilisateur sur le site (comme je l'ai fait), vous pouvez le faire avec

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

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

15
David Kühner

Si vous avez besoin de la liste des utilisateurs appartenant à un groupe, vous pouvez le faire à 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.

14
Mark Chackerian

Si un utilisateur appartient ou non à un certain groupe, il peut être archivé Django modèles en utilisant:

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

11
CODEkid

Vous avez juste besoin 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!")
10

Juste au cas où si vous voulez vérifier le groupe de l'utilisateur appartient à une liste de groupe prédéfinie:

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
1
James Sapam

Je l'ai fait de la manière suivante. Cela semble inefficace mais je n'avais pas d'autre moyen en tête:

@login_required
def list_track(request):

usergroup = request.user.groups.values_list('name', flat=True).first()
if usergroup in 'appAdmin':
    tracks = QuestionTrack.objects.order_by('pk')
    return render(request, 'cmit/appadmin/list_track.html', {'tracks': tracks})

else:
    return HttpResponseRedirect('/cmit/loggedin')
0
Mohammad

En une ligne:

'Groupname' in user.groups.values_list('name', flat=True)

Ceci a pour résultat soit True ou False.

0
Philipp Zedler