Jawaban:
Anda dapat mengakses grup hanya melalui groups
atribut aktif 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
lalu user.groups.all()
kembali [<Group: Editor>]
.
Atau, dan lebih langsung, Anda dapat memeriksa apakah pengguna berada dalam grup dengan:
if django_user.groups.filter(name = groupname).exists():
...
Catatan yang jugagroupname
bisa menjadi objek Grup Django yang sebenarnya.
Objek Pengguna Anda ditautkan ke objek Grup melalui ManyToMany hubungan .
Dengan demikian Anda dapat menerapkan metode filter ke user.groups .
Jadi, untuk memeriksa apakah Pengguna yang diberikan berada dalam grup tertentu ("Anggota" sebagai contoh), lakukan saja ini:
def is_member(user):
return user.groups.filter(name='Member').exists()
Jika Anda ingin memeriksa apakah pengguna tertentu memiliki lebih dari satu grup, gunakan operator __in seperti:
def is_in_multiple_groups(user):
return user.groups.filter(name__in=['group1', 'group2']).exists()
Perhatikan bahwa fungsi tersebut dapat digunakan dengan dekorator @user_passes_test untuk mengelola akses ke tampilan Anda:
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
Semoga bantuan ini
user in groups
(atau sebaliknya).
.exists()
sampai akhir untuk mengembalikan boolean? Jika tidak is_member()
dan is_in_multiple_groups()
akan mengembalikan QuerySet
, yang mungkin tidak memberikan hasil yang diinginkan.
def is_member(user): return user.is_superuser or user.groups.filter(...
is_in_multiple_groups
dapat secara eksplisit dinamai is_in_some_groups
karena tidak mengharuskan pengguna menjadi anggota dari semua grup
Jika Anda membutuhkan daftar pengguna yang ada dalam grup, Anda dapat melakukan ini sebagai gantinya:
from django.contrib.auth.models import Group
users_in_group = Group.objects.get(name="group name").user_set.all()
lalu periksa
if user in users_in_group:
# do something
untuk memeriksa apakah pengguna berada dalam grup.
user.groups.filter(name="group name").exists()
harus bekerja dengan baik. Solusi yang Anda tulis menggunakan dua pertanyaan dan karenanya tidak terlalu optimal.
Jika Anda tidak memerlukan instance pengguna di situs (seperti yang saya lakukan), Anda dapat melakukannya dengan
User.objects.filter(pk=userId, groups__name='Editor').exists()
Ini hanya akan menghasilkan satu permintaan ke database dan mengembalikan boolean.
Anda hanya perlu satu baris:
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!")
Untuk jaga-jaga jika Anda ingin memeriksa grup pengguna milik daftar grup yang telah ditentukan:
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
Saya memiliki situasi yang serupa, saya ingin menguji apakah pengguna berada dalam kelompok tertentu. Jadi, saya telah membuat file utils.py baru di mana saya meletakkan semua utilitas kecil saya yang membantu saya melalui seluruh aplikasi. Di sana, saya punya definisi ini:
utils.py
def is_company_admin(user):
return user.groups.filter(name='company_admin').exists()
jadi pada dasarnya saya sedang menguji apakah pengguna dalam grup company_admin dan untuk kejelasan saya sudah memanggil fungsi ini is_company_admin .
Ketika saya ingin memeriksa apakah pengguna di company_admin saya hanya melakukan ini:
views.py
from .utils import *
if is_company_admin(request.user):
data = Company.objects.all().filter(id=request.user.company.id)
Sekarang, jika Anda ingin menguji yang sama dalam template Anda, Anda dapat menambahkan is_user_admin dalam konteks Anda, sesuatu seperti ini:
views.py
return render(request, 'admin/users.html', {'data': data, 'is_company_admin': is_company_admin(request.user)})
Sekarang Anda dapat mengevaluasi respons Anda di templat:
users.html
{% if is_company_admin %}
... do something ...
{% endif %}
Solusi sederhana dan bersih, berdasarkan jawaban yang dapat ditemukan sebelumnya di utas ini, tetapi dilakukan secara berbeda. Semoga ini bisa membantu seseorang.
Diuji dalam Django 3.0.4.
data = Company.objects.all().filter(id=request.user.company.id)
, apa yang ditandakan Perusahaan? Apakah itu Model Anda?
Dalam satu baris:
'Groupname' in user.groups.values_list('name', flat=True)
Ini mengevaluasi salah satu True
atau False
.
.exists()
untuk membiarkan db melakukan pekerjaan.
Saya telah melakukannya dengan cara berikut. Tampaknya tidak efisien tetapi saya tidak memiliki cara lain dalam pikiran saya:
@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')
Saya melakukannya seperti ini. Untuk grup yang diberi nama 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)
templat
# index.html
{% if is_editor %}
<h1>Editor tools</h1>
{% endif %}
if user.groups.filter(name=group_name).count(): # do something