जवाबों:
आप केवल 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 समूह वस्तु हो।
आपका उपयोगकर्ता ऑब्जेक्ट 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()
ठीक काम करना चाहिए। आपके द्वारा लिखा गया समाधान दो प्रश्नों का उपयोग करता है और इसलिए बहुत इष्टतम नहीं है।
यदि आपको साइट पर उपयोगकर्ता उदाहरण की आवश्यकता नहीं है (जैसा कि मैंने किया था), तो आप इसके साथ कर सकते हैं
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