J'ai créé un groupe personnalisé sur le site d'administration de Django.
Dans mon code, je veux vérifier si un utilisateur fait partie de ce groupe. Comment je fais ça?
J'ai créé un groupe personnalisé sur le site d'administration de Django.
Dans mon code, je veux vérifier si un utilisateur fait partie de ce groupe. Comment je fais ça?
Vous pouvez accéder aux groupes simplement via l' groups
attribut sur 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()
revient [<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 qu'il groupname
peut également s'agir de l'objet Django Group réel.
if user.groups.filter(name=group_name).count(): # do something
Votre objet User est lié à l' objet Group via une relation ManyToMany .
Vous pouvez ainsi appliquer la méthode de filtrage à user.groups .
Donc, pour vérifier si un utilisateur donné est dans un certain groupe ("Membre" pour l'exemple), il suffit de faire ceci:
Si vous voulez vérifier si un utilisateur donné appartient à plus d'un groupe donné, utilisez l' opérateur __in comme ceci:
Notez que ces fonctions peuvent être utilisées avec le décorateur @user_passes_test pour gérer l'accès à vos vues:
J'espère que cette aide
la source
user in groups
(ou vice versa)..exists()
à la fin pour renvoyer un booléen? Sinon,is_member()
etis_in_multiple_groups()
renverra aQuerySet
, ce qui risque de ne pas donner le résultat souhaité.def is_member(user): return user.is_superuser or user.groups.filter(...
is_in_multiple_groups
peut être nommé plus explicitementis_in_some_groups
car il ne nécessite pas que l'utilisateur soit membre de tous les groupesSi vous avez besoin de la liste des utilisateurs appartenant à un groupe, vous pouvez le faire à la place:
puis vérifiez
pour vérifier si l'utilisateur fait partie du groupe.
la source
user.groups.filter(name="group name").exists()
devrait bien fonctionner. La solution que vous avez écrite utilise deux requêtes et donc pas très optimale.Si vous n'avez pas besoin de l'instance utilisateur sur le site (comme je l'ai fait), vous pouvez le faire avec
Cela produira une seule requête à la base de données et retournera un booléen.
la source
Si un utilisateur appartient ou non à un certain groupe, peut être vérifié dans les modèles django en utilisant:
{% if group in request.user.groups.all %}
"some action"
{% endif %}
la source
Vous avez juste besoin d'une ligne:
la source
Juste au cas où vous voudriez vérifier que le groupe de l'utilisateur appartient à une liste de groupes prédéfinie:
la source
J'ai une situation similaire, je voulais tester si l'utilisateur est dans un certain groupe. J'ai donc créé un nouveau fichier utils.py dans lequel j'ai mis tous mes petits utilitaires qui m'aident à travers toute l'application. Là, j'ai cette définition:
Donc, fondamentalement, je teste si l'utilisateur est dans le groupe company_admin et pour plus de clarté, j'ai appelé cette fonction is_company_admin .
Lorsque je veux vérifier si l'utilisateur est dans company_admin, je fais simplement ceci:
Maintenant, si vous souhaitez tester la même chose dans votre modèle, vous pouvez ajouter is_user_admin dans votre contexte, quelque chose comme ceci:
Vous pouvez maintenant évaluer votre réponse dans un modèle:
Solution simple et propre, basée sur des réponses qui peuvent être trouvées plus tôt dans ce fil, mais faites différemment. J'espère que cela aidera quelqu'un.
Testé dans Django 3.0.4.
la source
data = Company.objects.all().filter(id=request.user.company.id)
, que signifie Entreprise? Est-ce votre modèle?En une seule ligne:
Cela évalue soit
True
ouFalse
.la source
.exists()
pour laisser la base de données faire le travail.Je l'ai fait de la manière suivante. Cela semble inefficace mais je n'avais pas d'autre moyen dans mon esprit:
la source
User.objects.filter(username='tom', groups__name='admin').exists()
Cette requête vous informera de l'utilisateur: "tom", qu'il appartienne ou non au groupe "admin"
la source
Je l'ai fait comme ça. Pour le groupe nommé
Editor
.modèle
la source