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?
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.
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
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.
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.
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 %}
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!")
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
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')
En une ligne:
'Groupname' in user.groups.values_list('name', flat=True)
Ceci a pour résultat soit True
ou False
.