উত্তর:
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
করতে পারেন এছাড়াও প্রকৃত জ্যাঙ্গো গ্রুপের অবজেক্ট হতে।
আপনার ব্যবহারকারীর অবজেক্টটি মুল টোমনি সম্পর্কের মাধ্যমে গ্রুপ অবজেক্টের সাথে লিঙ্কযুক্ত ।
আপনি এর মাধ্যমে ফিল্টার পদ্ধতিটি ইউজারআর গ্রুপগুলিতে প্রয়োগ করতে পারেন ।
সুতরাং, প্রদত্ত ব্যবহারকারী নির্দিষ্ট গ্রুপে রয়েছে কিনা তা পরীক্ষা করতে (উদাহরণস্বরূপ "সদস্য"), কেবল এটি করুন:
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
এই সাহায্য আশা করি
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()
এটি ডাটাবেসে কেবল একটি অনুরোধ উত্পন্ন করবে এবং একটি বুলিয়ান ফিরিয়ে দেবে।
যদি কোনও ব্যবহারকারী কোনও নির্দিষ্ট গোষ্ঠীর অন্তর্ভুক্ত বা না থাকে তবে ডিজেঙ্গো টেমপ্লেটগুলি ব্যবহার করে এটি পরীক্ষা করা যেতে পারে:
{% if group in request.user.groups.all %}
"some action"
{% endif %}
আপনার কেবল একটি লাইন দরকার:
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
আমার একই পরিস্থিতি আছে, আমি ব্যবহারকারীটি কোনও নির্দিষ্ট গ্রুপে থাকলে কিনা তা পরীক্ষা করতে চেয়েছিলাম। সুতরাং, আমি নতুন ফাইল 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)
, সংস্থাটি কী বোঝায়? এটা কি আপনার মডেল?
এক লাইনে:
'Groupname' in user.groups.values_list('name', flat=True)
এটি হয় True
বা হয় মূল্যায়ন False
।
.exists()
ডিবিটিকে কাজটি করতে দেওয়া ভাল to
আমি এটি নিম্নলিখিত পদ্ধতিতে সম্পন্ন করেছি। অদক্ষ মনে হচ্ছে তবে আমার মনে অন্য কোনও উপায় ছিল না:
@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