Saya mengalami sedikit kesulitan memahami cara kerja CBV baru. Pertanyaan saya adalah ini, saya perlu meminta login di semua tampilan, dan di beberapa dari mereka, izin khusus. Dalam tampilan berbasis fungsi saya melakukannya dengan @permission_required () dan atribut login_required dalam tampilan, tapi saya tidak tahu bagaimana melakukan ini pada tampilan baru. Apakah ada bagian dalam dokumen django yang menjelaskan hal ini? Saya tidak menemukan apa pun. Apa yang salah dalam kode saya?
Saya mencoba menggunakan @method_decorator tetapi menjawab " TypeError at / spasi / prueba / _wrapped_view () membutuhkan setidaknya 1 argumen (0 diberikan) "
Berikut adalah kode (GPL):
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ViewSpaceIndex(DetailView):
"""
Show the index page of a space. Get various extra contexts to get the
information for that space.
The get_object method searches in the user 'spaces' field if the current
space is allowed, if not, he is redirected to a 'nor allowed' page.
"""
context_object_name = 'get_place'
template_name = 'spaces/space_index.html'
@method_decorator(login_required)
def get_object(self):
space_name = self.kwargs['space_name']
for i in self.request.user.profile.spaces.all():
if i.url == space_name:
return get_object_or_404(Space, url = space_name)
self.template_name = 'not_allowed.html'
return get_object_or_404(Space, url = space_name)
# Get extra context data
def get_context_data(self, **kwargs):
context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
place = get_object_or_404(Space, url=self.kwargs['space_name'])
context['entities'] = Entity.objects.filter(space=place.id)
context['documents'] = Document.objects.filter(space=place.id)
context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
return context
sumber
message
?Inilah pendekatan saya, saya membuat mixin yang dilindungi (ini disimpan di perpustakaan mixin saya):
Kapan pun Anda ingin tampilan dilindungi, tambahkan saja mixin yang sesuai:
Pastikan mixin Anda yang pertama.
Pembaruan: Saya memposting ini pada tahun 2011, dimulai dengan versi 1.9. Django sekarang menyertakan ini dan mixin lain yang berguna (AccessMixin, PermissionRequiredMixin, UserPassesTestMixin) sebagai standar!
sumber
Berikut ini alternatif menggunakan dekorator berbasis kelas:
Ini kemudian dapat digunakan seperti ini:
sumber
class_view_decorator(my_decorator(*args, **kwargs))
. Adapun pencocokan metode kondisional - Anda dapat memodifikasi class_view_decorator untuk diterapkan sendiriView.get
atauView.post
bukanView.dispatch
.Saya menyadari bahwa utas ini agak ketinggalan jaman, tapi ini dua sen saya.
dengan kode berikut:
kita sekarang memiliki cara untuk menambal dekorator, jadi itu akan menjadi multifungsi. Ini secara efektif berarti bahwa ketika diterapkan pada dekorator tampilan biasa, seperti:
dekorator ini akan tetap berfungsi saat digunakan seperti yang seharusnya:
tetapi juga akan berfungsi dengan baik bila digunakan seperti itu:
Ini tampaknya berfungsi dengan baik dalam beberapa kasus yang baru-baru ini saya temui, termasuk contoh dunia nyata ini:
Fungsi ajax_view ditulis untuk mengubah tampilan (berbasis fungsi), sehingga menimbulkan kesalahan 404 setiap kali tampilan ini dikunjungi oleh panggilan non ajax. Dengan hanya menerapkan fungsi tambalan sebagai dekorator, dekorator ini siap untuk bekerja dalam tampilan berbasis kelas juga
sumber
Bagi Anda yang menggunakan Django> = 1,9 , itu sudah termasuk dalam
django.contrib.auth.mixins
sebagaiAccessMixin
,LoginRequiredMixin
,PermissionRequiredMixin
danUserPassesTestMixin
.Jadi untuk menerapkan LoginRequired ke CBV (mis
DetailView
):Ini juga baik untuk diingat GCBV Mixin rangka: mixin harus pergi di kiri sisi, dan dasar pandangan kelas harus pergi di kanan sisi. Jika urutannya berbeda, Anda bisa mendapatkan hasil yang rusak dan tidak terduga.
sumber
Gunakan Kawat Gigi Django. Ini menyediakan banyak mixin berguna yang mudah tersedia. Itu memiliki dokumen yang indah. Cobalah.
Anda bahkan dapat membuat mixin khusus Anda.
http://django-braces.readthedocs.org/en/v1.4.0/
Kode Contoh:
sumber
Jika ini adalah situs tempat mayoritas halaman mengharuskan pengguna untuk login, Anda dapat menggunakan middleware untuk memaksa login pada semua tampilan kecuali beberapa yang ditandai secara khusus.
Pre Django 1.10 middleware.py:
views.py:
Tampilan pihak ketiga yang tidak ingin Anda bungkus dapat dikecualikan dalam pengaturan:
settings.py:
sumber
Dalam kode saya, saya telah menulis adaptor ini untuk mengadaptasi fungsi anggota ke fungsi non-anggota:
Anda cukup menggunakannya seperti ini:
sumber
method_decorator
). Tampaknya cara yang bagus dan mudah dibaca untuk mencapai ini.Ini sangat mudah dengan Django> 1.9 datang dengan dukungan untuk
PermissionRequiredMixin
danLoginRequiredMixin
Impor saja dari auth
views.py
Untuk lebih jelasnya baca Otorisasi di Django
sumber
Sudah lama sekarang dan sekarang Django telah banyak berubah.
Periksa di sini untuk cara menghias tampilan berbasis kelas.
https://docs.djangoproject.com/en/2.2/topics/class-based-views/intro/#decorating-the-class
Dokumentasi tidak termasuk contoh "dekorator yang mengambil argumen apa pun". Tapi dekorator yang mengambil argumen seperti ini:
jadi jika kita ingin menggunakan mydec sebagai dekorator "normal" tanpa argumen, kita dapat melakukan ini:
Demikian pula, untuk digunakan
permission_required
denganmethod_decorator
kita bisa:
sumber
Jika Anda melakukan proyek yang memerlukan berbagai tes izin, Anda bisa mewarisi kelas ini.
sumber
Saya telah melakukan perbaikan berdasarkan solusi Josh
Penggunaan sampel:
sumber
Di sini solusi untuk penghias permit_required:
sumber