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


147

मैंने Django की व्यवस्थापक साइट में एक कस्टम समूह बनाया है।

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

जवाबों:


118

आप केवल 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 समूह वस्तु हो।


112
वास्तविक जाँच होगीif user.groups.filter(name=group_name).count(): # do something
Maccesch

144
या उपयोग .exists () के बजाय .count ()
रेयान

3
प्रश्न उन समूहों के लिए उपयोगकर्ता मॉडल को क्वेरी करने के बारे में है, जो तात्कालिकता के लिए नहीं हैं ...
---

210

आपका उपयोगकर्ता ऑब्जेक्ट 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

उममीद है कि इससे मदद मिलेगी


4
मुझे django के DB पहुंच के आंतरिक कामकाज के बारे में निश्चित नहीं है, लेकिन यह बहुत अधिक कुशल लगता है तो कुछ अन्य सुझाव भी हैं, जैसे समूह में सभी उपयोगकर्ताओं को प्राप्त करना और एक मानक अजगर user in groups(या इसके विपरीत) करना।
ब्रायनमर्न्स

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

4
Django के दस्तावेज़ के अनुसार, इसका उपयोग वास्तव में तेज़ है (मौजूद है) क्योंकि यह क्वेरी का
चार्ल्सटन

5
आप शायद सुपरसुअर को परीक्षा पास करना चाहते हैं (डेटाबेस को क्वेरी किए बिना):def is_member(user): return user.is_superuser or user.groups.filter(...
डेव

is_in_multiple_groupsअधिक स्पष्ट रूप is_in_some_groupsसे इसका नाम दिया जा सकता है क्योंकि इसके लिए उपयोगकर्ता को सभी समूहों का सदस्य होना आवश्यक नहीं है
पीटरवर्मोंट

15

यदि आपको उन उपयोगकर्ताओं की सूची की आवश्यकता है जो किसी समूह में हैं, तो आप इसके बजाय ऐसा कर सकते हैं:

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

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


5
यह उपयोगकर्ताओं की एक छोटी संख्या के साथ साइटों के लिए अच्छी तरह से पैमाने पर नहीं है, क्योंकि यह बड़े उपसमुच्चय उपयोगकर्ता तालिका को हर बार स्मृति में लोड करेगा।
भाऊर

1
user.groups.filter(name="group name").exists()ठीक काम करना चाहिए। आपके द्वारा लिखा गया समाधान दो प्रश्नों का उपयोग करता है और इसलिए बहुत इष्टतम नहीं है।
नूपुर फलाक

जैसा कि यह कहा गया है, "यदि आपको उन उपयोगकर्ताओं की सूची की आवश्यकता है जो एक समूह में हैं" ...
मार्क चेकरियन

15

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

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

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


11

यदि कोई उपयोगकर्ता किसी निश्चित समूह का है या नहीं, तो इसका उपयोग करके django टेम्प्लेट में जाँच की जा सकती है:

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


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

10

आपको बस एक पंक्ति की आवश्यकता है:

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

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

1

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

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


1

मेरे पास समान स्थिति है, मैं परीक्षण करना चाहता था कि उपयोगकर्ता किसी निश्चित समूह में है या नहीं। इसलिए, मैंने नई फ़ाइल 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), कंपनी क्या संकेत देती है? क्या यह आपका मॉडल है?
हेडन

हां @hayden, इस मामले में कंपनी मेरा मॉडल है।
ब्रांको रेडोजेविक

0

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

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

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


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

0

मैंने इसे निम्नलिखित तरीके से किया है। अक्षम लगता है, लेकिन मेरे मन में कोई दूसरा रास्ता नहीं था:

@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')

0

User.objects.filter(username='tom', groups__name='admin').exists()

वह क्वेरी आपको उपयोगकर्ता को सूचित करेगी: "टॉम" चाहे वह समूह "एडमिन" से संबंधित हो या नहीं


group__name डबल अंडरस्कोर के साथ
Trung Lê

0

मैंने इसे इस तरह किया। नाम वाले समूह के लिए 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 %}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.