2011-01-25 11 views
90

मैंने Django की व्यवस्थापक साइट में एक कस्टम समूह बनाया।Django में, मैं कैसे जांचूं कि कोई उपयोगकर्ता किसी निश्चित समूह में है या नहीं?

मेरे कोड में, मैं यह जांचना चाहता हूं कि कोई उपयोगकर्ता इस समूह में है या नहीं। मैं उसको कैसे करू?

उत्तर

70

आप 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>]

+87

वास्तविक जाँच होगी 'अगर user.groups.filter (नाम = group_name) .count(): # कुछ करें ' – Maccesch

+113

या .count() –

10

आपको लगता है कि एक समूह में हैं उपयोगकर्ताओं की सूची की जरूरत है, तो आप इस के बजाय कर सकते हैं:

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 

यह जांचने के लिए कि उपयोगकर्ता समूह में है या नहीं।

+4

के बजाय .exists() का उपयोग करें यह उपयोगकर्ताओं की एक छोटी संख्या से अधिक साइटों के लिए अच्छी तरह से स्केल नहीं करता है, क्योंकि यह बड़ी सबसेट उपयोगकर्ता तालिका लोड करेगा हर बार यह स्मृति में स्मृति। – bhuber

0
शायद ज़रुरत पड़े

अगर आप चाहते हैं की जांच उपयोगकर्ता की समूह एक पूर्वनिर्धारित समूह सूची के अंतर्गत आता है:

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 
+2

[FYI आप {x.name में x के लिए usr.groups.all()} में जा सकते हैं] (http://docs.python.org/2/tutorial/datastructures.html#sets) – Kos

135

आपका उपयोगकर्ता वस्तु एक 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 

आशा इस मदद

+4

मुझे यकीन नहीं है डीजेंगो की डीबी एक्सेस की आंतरिक कार्यप्रणाली, लेकिन यह कुछ और सुझावों के बाद बहुत अधिक कुशल लगता है, जैसे समूह में सभी उपयोगकर्ताओं को प्राप्त करना और मानक पायथन 'समूह में उपयोगकर्ता' (या इसके विपरीत) करना। – brianmearns

+0

आपकी टिप्पणी के लिए धन्यवाद! – Charlesthk

+1

क्या आपको बूलियन लौटने के लिए अंत में '.exists()' जोड़ना नहीं है? अन्यथा 'is_member()' और 'is_in_multiple_groups()' एक 'क्वेरीसेट' वापस कर देगा, जो वांछित परिणाम नहीं दे सकता है। –

0

एक पंक्ति में:

'Groupname' in user.groups.values_list('name', flat=True) 

यह या तो True या False मूल्यांकन करता है।

+1

यह अक्षम है, क्योंकि यह बहुत अधिक डेटा प्राप्त करेगा, और उसके बाद डीजेंगो के पक्ष पर इसे संचालित करेगा। यह '.exists() 'का उपयोग करने के लिए बेहतर है डीबी काम करते हैं। – WhyNotHugo

6

आप सिर्फ एक लाइन की जरूरत है:

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!") 
+3

हालांकि बहुत साफ कोड नहीं है, और बहुत पुन: प्रयोज्य नहीं है, लेकिन इसे एक पंक्ति में लाने के लिए +1। – WhyNotHugo

10

आप (के रूप में मैंने किया था) साइट पर उपयोगकर्ता उदाहरण की जरूरत नहीं है, तो आप

User.objects.filter(pk=userId, groups__name='Editor').exists() 

यह केवल उत्पादन करेगा के साथ यह कर सकते हैं डेटाबेस के लिए एक अनुरोध और एक बुलियन लौटाना।

7

एक उपयोगकर्ता एक निश्चित समूह या नहीं के अंतर्गत आता है, तो Django टेम्पलेट्स में उपयोग कर जाँच की जा सकती:

{% if group in request.user.groups.all %} "some action" {% endif %}

+1

यह मेरे लिए काम नहीं करता है, ऐसा लगता है कि समूहों के समूह के साथ समूह की तुलना करने की आवश्यकता है – hosein

संबंधित मुद्दे

 संबंधित मुद्दे