답변:
의 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
수 도 실제 장고 그룹 개체 수.
귀하의 사용자 개체가 연결되어 그룹의 스루 객체 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()
를 반환합니다 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()
잘 작동합니다. 작성한 솔루션은 두 가지 쿼리를 사용하므로 최적이 아닙니다.
한 줄만 있으면됩니다.
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 %}
이 스레드의 앞부분에서 찾을 수 있지만 다르게 수행되는 답변을 기반으로하는 단순하고 깨끗한 솔루션입니다. 누군가에게 도움이되기를 바랍니다.
장고 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()
db가 작업을 수행하도록하는 것이 좋습니다 .
나는 다음과 같이했다. 비효율적 인 것 같지만 다른 방법은 없었습니다.
@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