biotech Django & Python

Django CBV vs FBV: Sınıf ve Fonksiyon Temelli Görünümler Tam Karşılaştırma

AK
Ali Kasımoğlu
18 Nis 2021 schedule 3 dk okuma
Django {p}CBV vs FBV{/p}: Sınıf ve Fonksiyon Temelli Görünümler Tam Karşılaştırma
analytics

Insight Density

groups Hedef Kitle: Deneyimli
65 Score

Teknik karmaşıklık ve içerik yoğunluğuna göre hesaplandı.

Son güncelleme: Nisan 2026 · AnomixLabs Teknik Ekibi

CBV ve FBV birbirinin rakibi değil, tamamlayıcısıdır. Django'yu iyi bilen geliştirici her ikisini de kullanır — göreve göre doğru aracı seçer.

1. Function-Based Views (FBV)

FBV, bir Python fonksiyonu olarak yazılan view'dır. GET ve POST isteklerini request.method kontrolüyle ayrıştırır. Basitliği ve okunabilirliği güçlü yönleri:

from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from .models import Article
from .forms import ArticleForm

@login_required
def article_create(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST)
        if form.is_valid():
            article = form.save(commit=False)
            article.author = request.user
            article.save()
            return redirect(article)
    else:
        form = ArticleForm()
    return render(request, 'article_form.html', {'form': form})

2. Class-Based Views (CBV) — Generic Views

CBV, Django'nun sınıf hiyerarşisini kullanır. Generic view'lar standart CRUD kalıplarını minimal kodla sunar:

from django.views.generic import (
    ListView, DetailView, CreateView, UpdateView, DeleteView
)
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy

class ArticleListView(ListView):
    model = Article
    template_name = 'article_list.html'
    context_object_name = 'articles'
    paginate_by = 10
    ordering = ['-created_at']

class ArticleDetailView(DetailView):
    model = Article
    slug_field = 'slug'

class ArticleCreateView(LoginRequiredMixin, CreateView):
    model = Article
    fields = ['title', 'content']
    login_url = '/giris/'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

class ArticleDeleteView(LoginRequiredMixin, DeleteView):
    model = Article
    success_url = reverse_lazy('article_list')

3. get_queryset ve get_context_data Override

class ArticleListView(ListView):
    model = Article

    def get_queryset(self):
        # Sadece yayınlanmış makaleleri, N+1'den kaçınarak getir
        return Article.objects.filter(
            is_published=True,
        ).select_related('author', 'category')\
         .prefetch_related('tags')

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx['total_count'] = self.get_queryset().count()
        ctx['categories'] = Category.objects.all()
        return ctx

4. Mixin MRO Tuzağı

Birden fazla mixin kullanırken Python'ın Method Resolution Order (MRO) sırası kritiktir. LoginRequiredMixin her zaman birinci olmalıdır:

# DOĞRU — LoginRequiredMixin birinci
class ArticleCreateView(LoginRequiredMixin, CreateView):
    ...

# YANLIŞ — MRO çakışması, login redirect çalışmaz
class ArticleCreateView(CreateView, LoginRequiredMixin):
    ...

# Sırayı görmek için:
print(ArticleCreateView.__mro__)

5. Özel Mixin Yazmak

class AuthorRequiredMixin:
    """Yalnızca nesnenin sahibinin erişebildiği mixin."""

    def get_object(self):
        obj = super().get_object()
        if obj.author != self.request.user:
            from django.core.exceptions import PermissionDenied
            raise PermissionDenied
        return obj

class ArticleUpdateView(LoginRequiredMixin, AuthorRequiredMixin, UpdateView):
    model = Article
    fields = ['title', 'content']

6. FormView ile Özel Form Yönetimi

from django.views.generic.edit import FormView

class SearchView(FormView):
    template_name = 'search.html'
    form_class = SearchForm
    success_url = '.'  # Aynı sayfaya dön

    def form_valid(self, form):
        query = form.cleaned_data['query']
        # Arama işlemi, session'a kaydet vb.
        return super().form_valid(form)

7. Ne Zaman Hangisini Kullanmalı?

Senaryo Öneri Neden?
Standart CRUD CBV Generic views kod azaltır
Karmaşık iş mantığı FBV Doğrusal akış okunması kolay
Webhook / API endpoint FBV Tek işlev, basit kalıp
Login gerektiren sayfalar CBV (Mixin) LoginRequiredMixin tekrar kullanılır
Tekrar eden kalıp CBV Mixin ile DRY

8. Test Yazımı: FBV vs CBV

from django.test import TestCase, Client
from django.contrib.auth import get_user_model

User = get_user_model()

class ArticleViewTests(TestCase):
    def setUp(self):
        self.user = User.objects.create_user('ali', password='pass')
        self.client = Client()

    def test_list_view(self):
        response = self.client.get('/makaleler/')
        self.assertEqual(response.status_code, 200)

    def test_create_requires_login(self):
        response = self.client.get('/makaleler/yeni/')
        self.assertRedirects(response, '/giris/?next=/makaleler/yeni/')

    def test_create_logged_in(self):
        self.client.login(username='ali', password='pass')
        response = self.client.get('/makaleler/yeni/')
        self.assertEqual(response.status_code, 200)

9. URL Yapısı Karşılaştırması

urlpatterns = [
    # FBV
    path('yeni/', views.article_create, name='article_create'),

    # CBV — .as_view() zorunlu
    path('', ArticleListView.as_view(), name='article_list'),
    path('/', ArticleDetailView.as_view(), name='article_detail'),
    path('/sil/', ArticleDeleteView.as_view(), name='article_delete'),
]

Özet

Her iki yaklaşımı da bilin ve duruma göre seçin. CBV: standart CRUD, tekrar eden kalıplar, mixin gereksinimi. FBV: karmaşık iş mantığı, webhook, tek işlevli view. Mixin kullanırken MRO sırasına dikkat edin — LoginRequiredMixin daima birinci. Test yazımı her iki yaklaşımda da benzer kolaylıkta.

Django Class-Based Views ve Function-Based Views kullanım diyagramı

Sıkça Sorulan Sorular

Mixin sırası neden önemli? expand_more
Python'ın Method Resolution Order (MRO), birden fazla üst sınıf olduğunda hangi metodun önce çağrılacağını belirler. LoginRequiredMixin sona gelirse, dispatch() metodu önce CreateView'ın dispatch()'ini çalıştırır ve login kontrolü atlanır. Kural: en spesifik davranışı tanımlayan mixin (LoginRequiredMixin, PermissionRequiredMixin) her zaman solda (birinci) olmalıdır.
CBV'yi nasıl debug ederim? expand_more
CBV, FBV'den daha gizemli görünebilir. Debug için: 1) ccbv.co.uk sitesine gidin — her CBV'nin metodlarını ve MRO'sunu görselleştirir. 2) python manage.py shell'de print(ArticleListView.__mro__) çalıştırın. 3) Belirli metodları override ederek print() ekleyin. 4) Django Debug Toolbar'ın 'Request' paneli hangi view'ın çalıştığını gösterir.
CreateView'da form alanlarını özelleştirmek için ne yapmalıyım? expand_more
fields = ['title', 'content'] basit durumlar için yeterli. Özel form sınıfı için: form_class = ArticleForm belirtin. Form davranışını değiştirmek için get_form() veya get_initial() override edin. Kaydetmeden önce ek işlem için form_valid() içinde form.instance.field = value yapın ve super().form_valid(form) çağırın.
ViewSet ne zaman tercih edilmeli? expand_more
ViewSet, Django REST Framework'e özgüdür ve HTML view değil API endpoint'leri için kullanılır. Router ile otomatik URL oluşturur. Tek bir model için CRUD API yazıyorsanız ModelViewSet, kısmi CRUD için ReadOnlyModelViewSet tercih edin. Django template kullanan geleneksel view'lar için ViewSet yanlış araçtır — o durumda CBV veya FBV kullanın.
FBV vs CBV hangisi daha hızlı çalışır? expand_more
Performans farkı pratikte ihmal edilebilir düzeyde. Her ikisi de isteği işlemek için benzer miktarda Python kodu çalıştırır. Gerçek performans darboğazı: veritabanı sorguları, cache kullanımı, N+1 sorunları. select_related() ve prefetch_related() kullanımı, FBV/CBV seçiminden 100x daha fazla etki eder.
CBV ile TemplateView farkı nedir? expand_more
TemplateView, sadece bir template render eden en basit CBV'dir — model veya form yoktur. Statik sayfalar (Hakkımda, SSS) için idealdir. get_context_data() override ederek template'e veri geçebilirsiniz. Kullanım: class AboutView(TemplateView): template_name = 'about.html'. Çok basit sayfalar için FBV'den bile daha kısadır.
permission_required nasıl CBV'de kullanılır? expand_more
PermissionRequiredMixin kullanın: class StaffView(PermissionRequiredMixin, ListView): permission_required = 'blog.view_article'. Birden fazla izin için: permission_required = ('blog.view_article', 'blog.change_article'). Tüm izinlerin gerekli olması için raise_exception = True. Kullanıcı izni yoksa 403 döner veya login sayfasına yönlendirilir.
Etiketler: #Django #CBV #FBV #Class-Based Views #Function-Based Views #ListView #Mixin #MRO #ViewSet
share

Bu Makaleyi Paylaş

Bilgiyi ağınızla paylaşarak bize destek olun.

AK

Ali Kasımoğlu

Full-stack Geliştirici & AnomixLabs Kurucusu

Python ve Django ekosisteminde uzmanlaşmış bir yazılım geliştirici. Modern web mimarileri, yapay zeka entegrasyonları ve minimalist kullanıcı deneyimleri üzerine odaklanıyor. AnomixLabs çatısı altında, karmaşık problemleri yalın ve etkili dijital çözümlere dönüştürmeyi hedefliyor.

psychology
psychology

Makale Hakkında Soru Sorun

AnomixAI · Makale içeriğine dayalı yanıtlar

5 soru hakkı
Yalnızca makale içeriği hakkında 0/500
forward_to_inbox

Geleceği Çözümleyin.

Enterprise yapay zeka, yazılım mimarisi ve dijital dönüşüm üzerine aylık brifingi alan 5.000+ mühendis ve kurucuya katılın. Spam yok.