Öncelikle formların fonksiyon temelli kullanımına(Function-base views) bakalım.
from django.http import HttpResponseRedirect from django.shortcuts import render from .forms import MyForm def myview(request): if request.method == "POST": form = MyForm(request.POST) if form.is_valid(): # <process form cleaned data> return HttpResponseRedirect('/success/') else: form = MyForm(initial={'key': 'value'}) return render(request, 'form_template.html', {'form': form})
Şimdi de sınıf tabanlı görünümlerde (Class-based views) form kullanımına bakalım:from django.http import HttpResponseRedirect from django.shortcuts import render from django.views import View from .forms import MyForm class MyFormView(View): form_class = MyForm initial = {'key': 'value'} template_name = 'form_template.html' def get(self, request, *args, **kwargs): form = self.form_class(initial=self.initial) return render(request, self.template_name, {'form': form}) def post(self, request, *args, **kwargs): form = self.form_class(request.POST) if form.is_valid(): # <process form cleaned data> return HttpResponseRedirect('/success/') return render(request, self.template_name, {'form': form})
Bu form class görünüm sayesinde overriding gibi yöntemlerle farklı görünümler geliştirilebilir. Farklı görünümleri URLconf, alt sınıfları oluştururken overriding methodları kullanarak yapabilirsiniz.
Sınıf tabanlı görünümde dekorasyonlar (Decorating class-based views):
Sınıf tabanlı görünüm (class-base views) geliştirmede mix-ins'in yanısıra decorating ile de geliştirilebilir. Sınıf temelli görünümlerin fonksiyonel özelliği olmadığını biliyoruz. Sınıf temelli görünümlere bu fonksiyonelliği as_view( ) ve alt sınıflar oluşturarak kazandırabiliriz.
URLconf kullanarak dekorasyon uygulama(Decorating in URLconf):
As_view () metodunun sonucunu süsleyerek (decorating) sınıf tabanlı görünümleri ayarlayabilirsiniz. Bunu yapmanın en kolay yeri, görünümü(views) dağıttığınız URLconf'dur. O zaman URLconf dosyasındaki duruma bakalım:from django.contrib.auth.decorators import login_required, permission_required from django.views.generic import TemplateView from .views import VoteView urlpatterns = [ path('about/', login_required(TemplateView.as_view(template_name="secret.html"))), path('vote/', permission_required('polls.can_vote')(VoteView.as_view())), ]
Class ın kendisini decorating yapmak(Decorating the class):
Sınıf tabanlı bir görünümün (class-based views) her örneğini dekore etmek için, sınıf tanımının kendisini dekore etmeniz gerekir. Bunu yapmak için sınıfın dispatch ( ) metodunu kullanmak gerekir.Sınıflardaki metodlar , bağımsız bir fonksiyonla aynı işlevde değildir. ( burada metod ile fonksiyon arasındaki farkı iyi bilmeniz gerekir) Bu nedenle metoda yalnızca bir işlev dekoratörü uygulayamazsınız - önce onu bir metod dekoratörüne dönüştürmeniz gerekir. Method_decorator isimli bir dekoratör ile , bir fonksiyon dekoratörünü, metot dekoratörüne dönüştürürüz ve ardından bu dönüşen fonksiyon dekortörünün örneğini alarak kullanabiliriz.
Şimdi bu kullanımın örneğini inceleyelim:
from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic import TemplateView class ProtectedView(TemplateView): template_name = 'secret.html' @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs)
@method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
Birkaç yerde kullanılan bir dizi ortak dekoratörünüz varsa, method_decorator () öğesini birden çok kez çağırmak yerine bir dekoratör listesi veya demetini tanımlayabilir ve bunu kullanabilirsiniz. Şimdi bu kullanımı örnekle görelim.
Aşağıdaki örnekte liste yaparak decorator kullanımını gösteriyor. Yine örnekte never_cache (), isteği login_required () öncesinde işleyecektir.
decorators = [never_cache, login_required] @method_decorator(decorators, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html' @method_decorator(never_cache, name='dispatch') @method_decorator(login_required, name='dispatch') class ProtectedView(TemplateView): template_name = 'secret.html'
0 Yorumlar