Sınıf tabanlı görünümlerde (Class-based views)Form kullanımını nasıldır?

 Ö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())),
]




Bu yaklaşımda dekoratör her örnek için ayrı ayrı uygulanır. Bir views un her örneğinin dekore edilmesini istiyorsanız, farklı bir yaklaşım kullanmak gerekir. Bunun için sınıf tanımının kendisini decorating etmek gerekir. Bunun nasıl yapıldığını bir sonraki başlıkta inceleyelim.


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)

Daha kısa yoldan kullanımına baktığımızda, bunun yerine sınıfı dekore edebilir ve anahtar kelime argüman adı olarak dekore edilecek yöntemin adını iletebilirsiniz:
@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'

Bu örnekte, her ProtectedView örneğinde oturum açma koruması olacaktır. Bu örnekler login_required kullanır, ancak aynı davranış LoginRequiredMixin kullanılarak da elde edilebilir.

Yorum Gönder

0 Yorumlar