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 ?
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 ?
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
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).
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é.
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
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.
La vérification réelle serait if user.groups.filter(name=group_name).count(): # do something
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.
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.
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.
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.