জ্যাঙ্গোতে, কোনও ব্যবহারকারী কোনও নির্দিষ্ট গ্রুপে রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব?


146

আমি জ্যাঙ্গোর প্রশাসক সাইটে একটি কাস্টম গোষ্ঠী তৈরি করেছি।

আমার কোডে, আমি এই গ্রুপে কোনও ব্যবহারকারী রয়েছি কিনা তা পরীক্ষা করতে চাই। আমি কেমন করে ঐটি করি?

উত্তর:


117

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করতে পারেন এছাড়াও প্রকৃত জ্যাঙ্গো গ্রুপের অবজেক্ট হতে।


112
আসল if user.groups.filter(name=group_name).count(): # do something
চেকিংটি

144
বা .exists () পরিবর্তে .count () ব্যবহার
মিথ্যা রায়ান

3
প্রশ্নটি কীভাবে এটি সম্পর্কিত গ্রুপগুলির জন্য ব্যবহারকারীর মডেলকে জিজ্ঞাসা করা হচ্ছে, কীভাবে ইনস্ট্যান্টিয়েট করবেন না ... -.-
জেসিসি.সানাব্রিয়া

210

আপনার ব্যবহারকারীর অবজেক্টটি মুল টোমনি সম্পর্কের মাধ্যমে গ্রুপ অবজেক্টের সাথে লিঙ্কযুক্ত

আপনি এর মাধ্যমে ফিল্টার পদ্ধতিটি ইউজারআর গ্রুপগুলিতে প্রয়োগ করতে পারেন ।

সুতরাং, প্রদত্ত ব্যবহারকারী নির্দিষ্ট গ্রুপে রয়েছে কিনা তা পরীক্ষা করতে (উদাহরণস্বরূপ "সদস্য"), কেবল এটি করুন:

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()

মনে রাখবেন যে এই ফাংশনগুলি আপনার ব্যবহারের অ্যাক্সেস পরিচালনা করতে @ ব্যবহারকারীর_পাসগুলি_ সর্বশেষ সাজসজ্জারের সাথে ব্যবহার করা যেতে পারে :

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
জ্যাঙ্গোর ডিবি অ্যাক্সেসের অভ্যন্তরীণ কাজগুলি সম্পর্কে আমি নিশ্চিত নই, তবে এটি আরও অনেক কার্যকর বলে মনে হচ্ছে অন্য কয়েকটি পরামর্শ যেমন একটি গ্রুপে সমস্ত ব্যবহারকারীকে পাওয়া এবং একটি স্ট্যান্ডার্ড পাইথন user in groups(বা বিপরীতে) করা।
ব্রায়ানমার্ম

1
.exists()বুলেয়ান ফেরত দেওয়ার জন্য আপনাকে কি শেষের দিকে যুক্ত করতে হবে না? অন্যথায় is_member()এবং is_in_multiple_groups()একটি ফিরে আসবে QuerySet, যা পছন্দসই ফলাফল দিতে পারে না।
মাইকেল বেটস

4
জ্যাঙ্গোর ডকুমেন্টেশন অনুসারে, এটি কোয়েস্টেটের মূল্যায়ন না করায় এটি ব্যবহার করা প্রকৃতপক্ষে দ্রুততর () রয়েছে: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
চার্লিস্টক

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

যদি কোনও ব্যবহারকারী কোনও নির্দিষ্ট গোষ্ঠীর অন্তর্ভুক্ত বা না থাকে তবে ডিজেঙ্গো টেমপ্লেটগুলি ব্যবহার করে এটি পরীক্ষা করা যেতে পারে:

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


1
এটি আমার পক্ষে কাজ করে না, মনে হয় গ্রুপের সাথে গ্রুপের সাথে তুলনা করা দরকার
hosein

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।
নটহাগো

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

আমার একই পরিস্থিতি আছে, আমি ব্যবহারকারীটি কোনও নির্দিষ্ট গ্রুপে থাকলে কিনা তা পরীক্ষা করতে চেয়েছিলাম। সুতরাং, আমি নতুন ফাইল Uses.py তৈরি করেছি যেখানে আমি আমার সমস্ত ছোট ছোট ইউটিলিটিগুলি পুরো অ্যাপ্লিকেশনটির মাধ্যমে আমাকে সহায়তা করে। সেখানে, আমার এই সংজ্ঞা রয়েছে:

utils.py

def is_company_admin(user):
    return user.groups.filter(name='company_admin').exists()

সুতরাং মূলত আমি পরীক্ষা করে যাচ্ছি যে ব্যবহারকারী গ্রুপ- এডমিন গ্রুপে রয়েছে এবং স্পষ্টতার জন্য আমি এই ফাংশনটিকে__কম্প্যানি_ডমিন বলেছি

ব্যবহারকারী যখন কোম্পানির_ডমিনে আছে কিনা তা আমি যখন খতিয়ে দেখতে চাই আমি কেবল এটি করি:

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.0.4 এ পরীক্ষিত।


আপনার মধ্যে data = Company.objects.all().filter(id=request.user.company.id), সংস্থাটি কী বোঝায়? এটা কি আপনার মডেল?
হেডেন

হ্যাঁ হাইহেডেন, এক্ষেত্রে সংস্থাটি আমার মডেল।
ব্র্যাঙ্কো রাডোজেভিক

0

এক লাইনে:

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

এটি হয় Trueবা হয় মূল্যায়ন False


3
এটি অকার্যকর, যেহেতু এটি আরও অনেক বেশি ডেটা আনবে এবং তারপরে এটি জাঙ্গোর পক্ষে চালিত করবে। .exists()ডিবিটিকে কাজটি করতে দেওয়া ভাল to
নটহাগো

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()

এই ক্যোয়ারী আপনাকে ব্যবহারকারীকে অবহিত করবে: "টম" গ্রুপ "প্রশাসক" এর অন্তর্গত কিনা তা নয়


ডাবল আন্ডারস্কোর সহ গ্রুপ__নাম
ট্রুং 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 %}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.