web-dev-qa-db-fra.com

existe-t-il un moyen simple d'obtenir les noms de groupe d'un utilisateur dans django

J'ai essayé de suivre le code à l'aide de Django.contrib.auth.User et Django.contrib.auth.Group

for g in request.user.groups:
    l.append(g.name)

Mais cela a échoué et j'ai reçu ce qui suit Erreur:

TypeError at /
'ManyRelatedManager' object is not iterable
Request Method: GET
Request URL:    http://localhost:8000/
Exception Type: TypeError
Exception Value:    
'ManyRelatedManager' object is not iterable
Exception Location: C:\p4\projects\...\users.py in permission, line 55

Merci pour toute aide!

37
icn

Vous pouvez obtenir les groupes d'un utilisateur avec request.user.groups.all(), qui renverra un QuerySet. Et puis vous pouvez transformer cet objet en liste si vous le souhaitez.

for g in request.user.groups.all():
    l.append(g.name)

ou avec Django récent

l = request.user.groups.values_list('name',flat = True) # QuerySet Object
l_as_list = list(l)                                     # QuerySet to `list`
80
MattH

C'est mieux

if user.groups.filter(name='groupname').exists():
    # Action if existing

else:
    # Action if not existing
12
user.groups.all()[0].name == "groupname"
8
Kishor Pawar

C'est probablement un peu trop tard (je viens de rejoindre stackoverflow), mais pour quiconque google pour cela début 2018, vous pouvez utiliser le fait que Django Groups (par défaut) est livré avec ce qui suit domaines (non exhaustifs, juste les plus importants):

id, nom, autorisations, utilisateur (peut avoir plusieurs utilisateurs; ManyToMany)

Notez qu'un groupe peut être composé de plusieurs utilisateurs et qu'un utilisateur peut être membre de plusieurs groupes. Vous pouvez donc simplement filtrer le modèle Django Groups pour la session utilisateur en cours (assurez-vous d'avoir ajouté les groupes appropriés et affecté l'utilisateur à son/ses groupe (s)):

'''
This assumes you have set up Django auth properly to manage user logins
'''
# import Group models
from Django.contrib.auth.models import Group

# filter the Group model for current logged in user instance
query_set = Group.objects.filter(user = request.user)

# print to console for debug/checking
for g in query_set:
    # this should print all group names for the user
    print(g.name) # or id or whatever Group field that you want to display
3
aaronlhe