मैंने Django की व्यवस्थापक साइट में एक कस्टम समूह बनाया।Django में, मैं कैसे जांचूं कि कोई उपयोगकर्ता किसी निश्चित समूह में है या नहीं?
मेरे कोड में, मैं यह जांचना चाहता हूं कि कोई उपयोगकर्ता इस समूह में है या नहीं। मैं उसको कैसे करू?
मैंने Django की व्यवस्थापक साइट में एक कस्टम समूह बनाया।Django में, मैं कैसे जांचूं कि कोई उपयोगकर्ता किसी निश्चित समूह में है या नहीं?
मेरे कोड में, मैं यह जांचना चाहता हूं कि कोई उपयोगकर्ता इस समूह में है या नहीं। मैं उसको कैसे करू?
आप User
पर groups
विशेषता के माध्यम से समूहों तक आसानी से पहुंच सकते हैं।
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>]
आपको लगता है कि एक समूह में हैं उपयोगकर्ताओं की सूची की जरूरत है, तो आप इस के बजाय कर सकते हैं:
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
यह जांचने के लिए कि उपयोगकर्ता समूह में है या नहीं।
के बजाय .exists() का उपयोग करें यह उपयोगकर्ताओं की एक छोटी संख्या से अधिक साइटों के लिए अच्छी तरह से स्केल नहीं करता है, क्योंकि यह बड़ी सबसेट उपयोगकर्ता तालिका लोड करेगा हर बार यह स्मृति में स्मृति। – bhuber
अगर आप चाहते हैं की जांच उपयोगकर्ता की समूह एक पूर्वनिर्धारित समूह सूची के अंतर्गत आता है:
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
[FYI आप {x.name में x के लिए usr.groups.all()} में जा सकते हैं] (http://docs.python.org/2/tutorial/datastructures.html#sets) – Kos
आपका उपयोगकर्ता वस्तु एक ManyToMany संबंध के माध्यम से समूह वस्तु से जुड़ा हुआ है।
आप फ़िल्टर विधि उपयोगकर्ता.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
आशा इस मदद
मुझे यकीन नहीं है डीजेंगो की डीबी एक्सेस की आंतरिक कार्यप्रणाली, लेकिन यह कुछ और सुझावों के बाद बहुत अधिक कुशल लगता है, जैसे समूह में सभी उपयोगकर्ताओं को प्राप्त करना और मानक पायथन 'समूह में उपयोगकर्ता' (या इसके विपरीत) करना। – brianmearns
आपकी टिप्पणी के लिए धन्यवाद! – Charlesthk
क्या आपको बूलियन लौटने के लिए अंत में '.exists()' जोड़ना नहीं है? अन्यथा 'is_member()' और 'is_in_multiple_groups()' एक 'क्वेरीसेट' वापस कर देगा, जो वांछित परिणाम नहीं दे सकता है। –
एक पंक्ति में:
'Groupname' in user.groups.values_list('name', flat=True)
यह या तो True
या False
मूल्यांकन करता है।
यह अक्षम है, क्योंकि यह बहुत अधिक डेटा प्राप्त करेगा, और उसके बाद डीजेंगो के पक्ष पर इसे संचालित करेगा। यह '.exists() 'का उपयोग करने के लिए बेहतर है डीबी काम करते हैं। – WhyNotHugo
आप सिर्फ एक लाइन की जरूरत है:
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!")
हालांकि बहुत साफ कोड नहीं है, और बहुत पुन: प्रयोज्य नहीं है, लेकिन इसे एक पंक्ति में लाने के लिए +1। – WhyNotHugo
आप (के रूप में मैंने किया था) साइट पर उपयोगकर्ता उदाहरण की जरूरत नहीं है, तो आप
User.objects.filter(pk=userId, groups__name='Editor').exists()
यह केवल उत्पादन करेगा के साथ यह कर सकते हैं डेटाबेस के लिए एक अनुरोध और एक बुलियन लौटाना।
एक उपयोगकर्ता एक निश्चित समूह या नहीं के अंतर्गत आता है, तो Django टेम्पलेट्स में उपयोग कर जाँच की जा सकती:
{% if group in request.user.groups.all %}
"some action"
{% endif %}
यह मेरे लिए काम नहीं करता है, ऐसा लगता है कि समूहों के समूह के साथ समूह की तुलना करने की आवश्यकता है – hosein
वास्तविक जाँच होगी 'अगर user.groups.filter (नाम = group_name) .count(): # कुछ करें ' – Maccesch
या .count() –