Utworzyłem niestandardową grupę w serwisie administratora Django.
W moim kodzie chcę sprawdzić, czy użytkownik jest w tej grupie. W jaki sposób mogę to zrobić?
Utworzyłem niestandardową grupę w serwisie administratora Django.
W moim kodzie chcę sprawdzić, czy użytkownik jest w tej grupie. W jaki sposób mogę to zrobić?
Dostęp do grup można uzyskać po prostu za pomocą groups
atrybutu on 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
potem user.groups.all()
wraca [<Group: Editor>]
.
Alternatywnie, i bardziej bezpośrednio, możesz sprawdzić, czy użytkownik jest w grupie:
if django_user.groups.filter(name = groupname).exists():
...
Zauważ, że groupname
może to być również rzeczywisty obiekt Django Group.
if user.groups.filter(name=group_name).count(): # do something
Twój obiekt użytkownika jest połączony z obiektem Group za pośrednictwem relacji ManyToMany .
W ten sposób możesz zastosować metodę filtru do user.groups .
Aby więc sprawdzić, czy dany Użytkownik należy do określonej grupy (na przykład „Członek”), wykonaj następujące czynności:
Jeśli chcesz sprawdzić, czy dany użytkownik należy do więcej niż jednej podanej grupy, użyj operatora __in w następujący sposób:
Pamiętaj, że te funkcje mogą być używane z dekoratorem @user_passes_test do zarządzania dostępem do twoich widoków:
Mam nadzieję, że to pomoże
źródło
user in groups
(lub odwrotnie)..exists()
na końcu, aby zwrócić wartość logiczną? W przeciwnym razieis_member()
iis_in_multiple_groups()
zwróci aQuerySet
, co może nie dać pożądanego rezultatu.def is_member(user): return user.is_superuser or user.groups.filter(...
is_in_multiple_groups
można bardziej jednoznacznie nazwać,is_in_some_groups
ponieważ nie wymaga, aby użytkownik był członkiem wszystkich grupJeśli potrzebujesz listy użytkowników należących do grupy, możesz to zrobić:
a następnie sprawdź
aby sprawdzić, czy użytkownik jest w grupie.
źródło
user.groups.filter(name="group name").exists()
powinno działać dobrze. Rozwiązanie, które napisałeś, używa dwóch zapytań i dlatego nie jest zbyt optymalne.Jeśli nie potrzebujesz instancji użytkownika na miejscu (tak jak ja), możesz to zrobić za pomocą
Spowoduje to wygenerowanie tylko jednego żądania do bazy danych i zwrócenie wartości logicznej.
źródło
Jeśli użytkownik należy do określonej grupy lub nie, można to sprawdzić w szablonach django za pomocą:
{% if group in request.user.groups.all %}
"some action"
{% endif %}
źródło
Potrzebujesz tylko jednej linii:
źródło
Na wszelki wypadek, jeśli chcesz sprawdzić, czy grupa użytkownika należy do predefiniowanej listy grup:
źródło
Mam podobną sytuację, chciałem sprawdzić, czy użytkownik jest w określonej grupie. Dlatego utworzyłem nowy plik utils.py, w którym umieściłem wszystkie moje małe narzędzia, które pomagają mi w całej aplikacji. Mam taką definicję:
więc zasadniczo sprawdzam, czy użytkownik jest w grupie company_admin i dla jasności nazwałem tę funkcję is_company_admin .
Kiedy chcę sprawdzić, czy użytkownik jest na koncie company_admin , po prostu robię to:
Teraz, jeśli chcesz przetestować to samo w swoim szablonie, możesz dodać is_user_admin w swoim kontekście, coś takiego:
Teraz możesz ocenić swoją odpowiedź w szablonie:
Proste i przejrzyste rozwiązanie, oparte na odpowiedziach, które można znaleźć wcześniej w tym wątku, ale zrobiono inaczej. Mam nadzieję, że to komuś pomoże.
Przetestowane w Django 3.0.4.
źródło
data = Company.objects.all().filter(id=request.user.company.id)
, co oznacza Firma? Czy to twój model?W jednej linii:
Ocenia się albo
True
alboFalse
.źródło
.exists()
pozwolić dbowi wykonać całą pracę.Zrobiłem to w następujący sposób. Wydaje się nieefektywne, ale nie miałem innego wyjścia:
źródło
User.objects.filter(username='tom', groups__name='admin').exists()
To zapytanie poinformuje użytkownika: "tom", czy należy do grupy "admin", czy nie
źródło
Zrobiłem to w ten sposób. Dla grupy o nazwie
Editor
.szablon
źródło