Ответы:
Вы можете получить доступ к группам просто через groups
атрибут 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
затем user.groups.all()
возвращается [<Group: Editor>]
.
В качестве альтернативы, а точнее, вы можете проверить, входит ли пользователь в группу:
if django_user.groups.filter(name = groupname).exists():
...
Обратите внимание, что groupname
это также может быть фактический объект Django Group.
Ваш объект User связан с объектом Group через отношение ManyToMany .
Таким образом, вы можете применить метод фильтра к user.groups .
Итак, чтобы проверить, входит ли данный пользователь в определенную группу (например, «Участник»), просто сделайте это:
def is_member(user):
return user.groups.filter(name='Member').exists()
Если вы хотите проверить, принадлежит ли данный пользователь нескольким группам, используйте оператор __in, например:
def is_in_multiple_groups(user):
return user.groups.filter(name__in=['group1', 'group2']).exists()
Обратите внимание, что эти функции можно использовать с декоратором @user_passes_test для управления доступом к вашим представлениям:
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
Надеюсь это поможет
user in groups
(или наоборот).
.exists()
в конец, чтобы вернуть логическое значение? В противном случае is_member()
и is_in_multiple_groups()
вернет a QuerySet
, что может не дать желаемого результата.
def is_member(user): return user.is_superuser or user.groups.filter(...
is_in_multiple_groups
может быть более явно назван, is_in_some_groups
так как он не требует, чтобы пользователь был членом всех групп
Если вам нужен список пользователей, входящих в группу, вы можете сделать это вместо этого:
from django.contrib.auth.models import Group
users_in_group = Group.objects.get(name="group name").user_set.all()
а затем проверьте
if user in users_in_group:
# do something
проверить, есть ли пользователь в группе.
user.groups.filter(name="group name").exists()
должно работать нормально. Решение, которое вы написали, использует два запроса и поэтому не очень оптимально.
Если вам не нужен пользовательский экземпляр на сайте (как я сделал), вы можете сделать это с
User.objects.filter(pk=userId, groups__name='Editor').exists()
Это произведет только один запрос к базе данных и вернет логическое значение.
Вам просто нужна одна строка:
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!")
На всякий случай, если вы хотите проверить, входит ли группа пользователей в предопределенный список групп:
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
У меня похожая ситуация, я хотел проверить, находится ли пользователь в определенной группе. Итак, я создал новый файл utils.py, куда я помещаю все свои маленькие утилиты, которые помогают мне в работе всего приложения. Там у меня есть это определение:
utils.py
def is_company_admin(user):
return user.groups.filter(name='company_admin').exists()
так что в основном я тестирую, если пользователь находится в группе company_admin и для ясности я назвал эту функцию is_company_admin .
Когда я хочу проверить, есть ли пользователь в company_admin, я просто делаю это:
views.py
from .utils import *
if is_company_admin(request.user):
data = Company.objects.all().filter(id=request.user.company.id)
Теперь, если вы хотите проверить то же самое в своем шаблоне, вы можете добавить is_user_admin в вашем контексте, что-то вроде этого:
views.py
return render(request, 'admin/users.html', {'data': data, 'is_company_admin': is_company_admin(request.user)})
Теперь вы можете оценить свой ответ в шаблоне:
users.html
{% if is_company_admin %}
... do something ...
{% endif %}
Простое и понятное решение, основанное на ответах, которые можно найти ранее в этой теме, но сделано по-другому. Надеюсь, это кому-нибудь поможет.
Протестировано в Django 3.0.4.
data = Company.objects.all().filter(id=request.user.company.id)
означает компания? Это твоя модель?
В одной строке:
'Groupname' in user.groups.values_list('name', flat=True)
Это оценивает либо либо, True
либо False
.
.exists()
чтобы позволить БД сделать работу.
Я сделал это следующим образом. Кажется неэффективным, но у меня не было другого пути в моей голове:
@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')
Я сделал это так Для группы им Editor
.
# views.py
def index(request):
current_user_groups = request.user.groups.values_list("name", flat=True)
context = {
"is_editor": "Editor" in current_user_groups,
}
return render(request, "index.html", context)
шаблон
# index.html
{% if is_editor %}
<h1>Editor tools</h1>
{% endif %}
if user.groups.filter(name=group_name).count(): # do something