{"id":31080,"date":"2025-10-05T13:01:35","date_gmt":"2025-10-05T10:01:35","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/"},"modified":"2025-10-05T13:01:35","modified_gmt":"2025-10-05T10:01:35","slug":"django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/","title":{"rendered":"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan Django, h\u0131zl\u0131 ve verimli uygulamalar olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7at\u0131 sunar. Peki, web sayfalar\u0131n\u0131z\u0131n dinamik i\u00e7eri\u011fini nas\u0131l y\u00f6netiyorsunuz? Kullan\u0131c\u0131lar\u0131n isteklerine yan\u0131t veren ve onlara anlaml\u0131 bilgiler sunan o b\u00fcy\u00fcl\u00fc arka plan i\u015flemlerini merak ediyor musunuz? \u0130\u015fte bu noktada Django&#8217;nun Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (Function-Based Views &#8211; FBVs) devreye giriyor. Bu kapsaml\u0131 rehberde, FBV&#8217;lerin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiricilerden deneyimli profesyonellere kadar herkesin faydalanabilece\u011fi pratik bilgilerle donat\u0131lm\u0131\u015f bu makale, Django FBV&#8217;lerini ustal\u0131kla kullanman\u0131z i\u00e7in size yol g\u00f6sterecek.<\/p>\n<p>Web uygulamalar\u0131n\u0131n kalbinde, kullan\u0131c\u0131 isteklerini i\u015fleyen ve onlara uygun yan\u0131tlar \u00fcreten bir mekanizma yatar. Django ba\u011flam\u0131nda bu mekanizman\u0131n ad\u0131 &#8220;G\u00f6r\u00fcn\u00fcm&#8221; (View) olarak adland\u0131r\u0131l\u0131r. Bir web sitesine her eri\u015fti\u011finizde, taray\u0131c\u0131n\u0131z asl\u0131nda sunucuya bir &#8220;istek&#8221; (request) g\u00f6nderir. Bu istek, Django uygulaman\u0131za ula\u015ft\u0131\u011f\u0131nda, belirli bir g\u00f6r\u00fcn\u00fcm taraf\u0131ndan kar\u015f\u0131lan\u0131r. G\u00f6r\u00fcn\u00fcm, iste\u011fi analiz eder, gerekli veritaban\u0131 i\u015flemlerini yapar, hesaplamalar ger\u00e7ekle\u015ftirir ve sonu\u00e7 olarak kullan\u0131c\u0131ya g\u00f6sterilecek bir &#8220;yan\u0131t&#8221; (response) \u00fcretir. Bu yan\u0131t genellikle bir HTML sayfas\u0131, bir JSON verisi veya bir dosya olabilir.<\/p>\n<p>Django, bu g\u00f6r\u00fcn\u00fcmleri olu\u015fturman\u0131n iki ana yolunu sunar: Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBVs) ve S\u0131n\u0131f Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (Class-Based Views &#8211; CBVs). Bu makalede odak noktam\u0131z olan FBV&#8217;ler, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, Python fonksiyonlar\u0131 olarak tan\u0131mlan\u0131r. Basit, okunabilir ve \u00f6\u011frenmesi kolay yap\u0131lar\u0131yla \u00f6ne \u00e7\u0131karlar. \u00d6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projeler i\u00e7in veya karma\u015f\u0131k mant\u0131klar gerektiren \u00f6zel durumlar i\u00e7in ideal bir se\u00e7imdirler. Bir FBV yazd\u0131\u011f\u0131n\u0131zda, her bir HTTP iste\u011fi (GET, POST vb.) i\u00e7in do\u011frudan hangi i\u015flemlerin yap\u0131laca\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a belirtirsiniz. Bu durum, \u00f6zellikle bir iste\u011fin ya\u015fam d\u00f6ng\u00fcs\u00fc \u00fczerinde tam kontrol sahibi olmak istedi\u011finizde b\u00fcy\u00fck avantaj sa\u011flar.<\/p>\n<p>\u00d6rne\u011fin, bir blog uygulamas\u0131nda, bir makaleyi g\u00f6r\u00fcnt\u00fclemek i\u00e7in ayr\u0131 bir FBV, yeni bir makale olu\u015fturmak i\u00e7in ba\u015fka bir FBV veya mevcut bir makaleyi d\u00fczenlemek i\u00e7in farkl\u0131 bir FBV tan\u0131mlayabilirsiniz. Her fonksiyon, kendi i\u00e7inde ba\u011f\u0131ms\u0131z bir i\u015f mant\u0131\u011f\u0131na sahiptir ve belirli bir URL desenine e\u015fle\u015ftirilir. Bu yap\u0131, kodun mod\u00fclerli\u011fini art\u0131r\u0131r ve bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca, Python&#8217;\u0131n zengin fonksiyonel \u00f6zelliklerinden tam olarak yararlanman\u0131za olanak tan\u0131r. Python dekorat\u00f6rleri gibi g\u00fc\u00e7l\u00fc ara\u00e7lar\u0131 FBV&#8217;ler ile birle\u015ftirerek yetkilendirme (authentication) veya \u00f6nbellekleme (caching) gibi i\u015flemleri \u00e7ok daha zarif bir \u015fekilde y\u00f6netebilirsiniz. Bu esneklik, FBV&#8217;leri Django geli\u015ftiricileri aras\u0131nda pop\u00fcler bir se\u00e7enek haline getirmi\u015ftir. Bir sonraki b\u00f6l\u00fcmde, temel bir FBV&#8217;nin nas\u0131l olu\u015fturuldu\u011funu ad\u0131m ad\u0131m inceleyerek konuyu daha da somutla\u015ft\u0131raca\u011f\u0131z.<\/p>\n<h2>Django&#8217;da Temel Bir Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcm (FBV) Nas\u0131l Yaz\u0131l\u0131r?<\/h2>\n<p>\u015eimdi pratik k\u0131sma ge\u00e7elim ve basit bir Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcm\u00fcn (FBV) nas\u0131l olu\u015fturuldu\u011funu ad\u0131m ad\u0131m g\u00f6relim. Bir Django projesinde, g\u00f6r\u00fcn\u00fcmler genellikle uygulaman\u0131z\u0131n ana dizinindeki <code>views.py<\/code> dosyas\u0131na yaz\u0131l\u0131r. \u0130lk hedefimiz, kullan\u0131c\u0131ya &#8220;Merhaba Django D\u00fcnyas\u0131!&#8221; mesaj\u0131n\u0131 g\u00f6steren \u00e7ok basit bir web sayfas\u0131 olu\u015fturmak olacak. Bu s\u00fcre\u00e7, temelleri anlamak i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<ol>\n<li><strong><code>views.py<\/code> Dosyas\u0131nda G\u00f6r\u00fcn\u00fcm\u00fc Tan\u0131mlama:<\/strong><br \/>\n        \u0130lk olarak, uygulaman\u0131z\u0131n <code>views.py<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki Python fonksiyonunu ekleyin.<\/li>\n<\/ol>\n<pre><code>\nfrom django.shortcuts import render\nfrom django.http import HttpResponse\n\ndef merhaba_dunya(request):\n    \"\"\"\n    Kullan\u0131c\u0131ya basit bir \"Merhaba Django D\u00fcnyas\u0131!\" mesaj\u0131 d\u00f6nd\u00fcren g\u00f6r\u00fcn\u00fcm.\n    \"\"\"\n    return HttpResponse(\"<h1>Merhaba Django D\u00fcnyas\u0131!<\/h1>\")\n\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>merhaba_dunya<\/code> ad\u0131nda bir Python fonksiyonu tan\u0131mlad\u0131k. Bu fonksiyon, bir Django g\u00f6r\u00fcn\u00fcm\u00fc olabilmesi i\u00e7in mutlaka ilk parametre olarak <code>request<\/code> nesnesini almal\u0131d\u0131r. <code>request<\/code> nesnesi, kullan\u0131c\u0131n\u0131n yapt\u0131\u011f\u0131 istek hakk\u0131nda t\u00fcm bilgileri (HTTP metodu, parametreler, oturum bilgileri vb.) i\u00e7erir. Fonksiyon, basit\u00e7e bir <code>HttpResponse<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr. <code>HttpResponse<\/code>, taray\u0131c\u0131ya geri g\u00f6nderilecek metni veya HTML'i ta\u015f\u0131r. Burada, taray\u0131c\u0131ya do\u011frudan bir H1 ba\u015fl\u0131\u011f\u0131 i\u00e7inde \"Merhaba Django D\u00fcnyas\u0131!\" metnini g\u00f6nderiyoruz.<\/p>\n<ol start=\"2\">\n<li><strong>URL Yap\u0131land\u0131rmas\u0131 (<code>urls.py<\/code>):<\/strong><br \/>\n        G\u00f6r\u00fcn\u00fcm\u00fcm\u00fcz\u00fc tan\u0131mlad\u0131k, ancak Django'nun hangi URL adresine eri\u015fildi\u011finde bu g\u00f6r\u00fcn\u00fcm\u00fc \u00e7al\u0131\u015ft\u0131rmas\u0131 gerekti\u011fini hen\u00fcz s\u00f6ylemedik. Bu e\u015fle\u015ftirmeyi, uygulaman\u0131z\u0131n <code>urls.py<\/code> dosyas\u0131nda yapar\u0131z. E\u011fer uygulaman\u0131zda bir <code>urls.py<\/code> dosyas\u0131 yoksa, olu\u015fturman\u0131z gerekecektir.<\/li>\n<\/ol>\n<pre><code>\n# myapp\/urls.py (Uygulaman\u0131z\u0131n kendi urls.py dosyas\u0131)\nfrom django.urls import path\nfrom . import views # views.py dosyas\u0131ndaki g\u00f6r\u00fcn\u00fcmlerimizi i\u00e7e aktar\u0131yoruz\n\nurlpatterns = [\n    path('merhaba\/', views.merhaba_dunya, name='merhaba_dunya'),\n]\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kodda, <code>path('merhaba\/', views.merhaba_dunya, name='merhaba_dunya')<\/code> sat\u0131r\u0131, Django'ya \u015funu s\u00f6yler: \"E\u011fer kullan\u0131c\u0131 adres \u00e7ubu\u011funa '\/merhaba\/' yazarsa, <code>views<\/code> mod\u00fcl\u00fcndeki <code>merhaba_dunya<\/code> fonksiyonunu \u00e7al\u0131\u015ft\u0131r.\" <code>name='merhaba_dunya'<\/code> k\u0131sm\u0131 ise bu URL kal\u0131b\u0131na bir isim atar. Bu isim, URL'leri kod i\u00e7inde dinamik olarak olu\u015fturmak i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r (\u00f6rne\u011fin, \u015fablonlarda veya ba\u015fka g\u00f6r\u00fcn\u00fcmlerde).<\/p>\n<ol start=\"3\">\n<li><strong>Ana Proje URL'lerine Ekleme:<\/strong><br \/>\n        Son olarak, uygulaman\u0131z\u0131n <code>urls.py<\/code> dosyas\u0131n\u0131 ana projenizin <code>urls.py<\/code> dosyas\u0131na dahil etmeniz gerekir. Bu genellikle projenizin ana dizininde bulunan <code>myproject\/urls.py<\/code> dosyas\u0131d\u0131r.<\/li>\n<\/ol>\n<pre><code>\n# myproject\/urls.py (Ana projenizin urls.py dosyas\u0131)\nfrom django.contrib import admin\nfrom django.urls import path, include\n\nurlpatterns = [\n    path('admin\/', admin.site.urls),\n    path('uygulama\/', include('myapp.urls')), # myapp'in URL'lerini dahil ediyoruz\n]\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131m, <code>myapp.urls<\/code> i\u00e7indeki t\u00fcm URL kal\u0131plar\u0131n\u0131n <code>\/uygulama\/<\/code> \u00f6neki alt\u0131nda eri\u015filebilir olmas\u0131n\u0131 sa\u011flar. Yani, az \u00f6nce olu\u015fturdu\u011fumuz <code>merhaba_dunya<\/code> g\u00f6r\u00fcn\u00fcm\u00fcne eri\u015fmek i\u00e7in taray\u0131c\u0131n\u0131zda <code>http:\/\/127.0.0.1:8000\/uygulama\/merhaba\/<\/code> adresini ziyaret etmeniz gerekecektir. Projenizi \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra bu adrese gitti\u011finizde, taray\u0131c\u0131n\u0131zda \"Merhaba Django D\u00fcnyas\u0131!\" yaz\u0131s\u0131n\u0131 g\u00f6rmelisiniz. Bu basit \u00f6rnek, bir FBV'nin temel ak\u0131\u015f\u0131n\u0131 ve bir iste\u011fin nas\u0131l bir g\u00f6r\u00fcn\u00fcme y\u00f6nlendirildi\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Ancak \u00e7o\u011fu zaman sadece d\u00fcz metin d\u00f6nd\u00fcrmek yerine, daha zengin HTML \u015fablonlar\u0131 kullan\u0131r\u0131z. Bir sonraki b\u00f6l\u00fcmde \u015fablon entegrasyonuna de\u011finece\u011fiz.<\/p>\n<h2>Django FBV'lerinde \u015eablonlar ve Dinamik \u0130\u00e7erik Y\u00f6netimi Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Bir \u00f6nceki b\u00f6l\u00fcmde basit bir metin d\u00f6nd\u00fcrmeyi \u00f6\u011frendik, ancak ger\u00e7ek web uygulamalar\u0131 statik metinlerden \u00e7ok daha fazlas\u0131n\u0131 gerektirir. Kullan\u0131c\u0131lara daha zengin ve etkile\u015fimli deneyimler sunmak i\u00e7in genellikle HTML \u015fablonlar\u0131 kullan\u0131r\u0131z. Django, g\u00fc\u00e7l\u00fc \u015fablon motoru sayesinde dinamik i\u00e7erik olu\u015fturmay\u0131 olduk\u00e7a kolayla\u015ft\u0131r\u0131r. FBV'ler ile \u015fablonlar\u0131 birle\u015ftirmek, veritaban\u0131ndan \u00e7ekilen bilgileri veya karma\u015f\u0131k hesaplama sonu\u00e7lar\u0131n\u0131 kullan\u0131c\u0131 aray\u00fcz\u00fcne ta\u015f\u0131mak i\u00e7in vazge\u00e7ilmez bir y\u00f6ntemdir.<\/p>\n<p>\u015eablonlar\u0131 kullanmak i\u00e7in <code>HttpResponse<\/code> yerine <code>render<\/code> fonksiyonunu kullan\u0131r\u0131z. <code>render<\/code> fonksiyonu, bir iste\u011fi, bir \u015fablonu ve iste\u011fe ba\u011fl\u0131 olarak \u015fablona iletmek istedi\u011fimiz bir ba\u011flam (context) s\u00f6zl\u00fc\u011f\u00fcn\u00fc al\u0131r. Bu ba\u011flam, \u015fablon i\u00e7erisinde kullan\u0131labilecek de\u011fi\u015fkenleri i\u00e7erir. \u015eimdi bir \u00f6rnekle bu s\u00fcreci inceleyelim. Diyelim ki bir blog g\u00f6nderisini g\u00f6r\u00fcnt\u00fclemek istiyoruz. Blog g\u00f6nderisi ba\u015fl\u0131\u011f\u0131n\u0131 ve i\u00e7eri\u011fini dinamik olarak g\u00f6sterece\u011fiz.<\/p>\n<ol>\n<li><strong>\u015eablon Dosyas\u0131 Olu\u015fturma:<\/strong><br \/>\n        \u00d6ncelikle, uygulaman\u0131z\u0131n dizininde bir <code>templates<\/code> klas\u00f6r\u00fc olu\u015fturun (\u00f6rne\u011fin, <code>myapp\/templates\/<\/code>). Bu klas\u00f6r\u00fcn i\u00e7ine <code>blog_detay.html<\/code> ad\u0131nda bir dosya ekleyelim.<\/li>\n<\/ol>\n<pre><code>\n<!-- myapp\/templates\/blog_detay.html -->\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>{{ baslik }} - Blog Detay\u0131<\/title>\n    <style>\n        body { font-family: 'Arial', sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }\n        .container { max-width: 800px; margin: auto; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }\n        h1 { color: #0056b3; margin-bottom: 20px; }\n        p { line-height: 1.6; margin-bottom: 15px; }\n        \/* Mobil uyumluluk i\u00e7in temel \u00f6rnek *\/\n        @media (max-width: 600px) {\n            .container { padding: 15px; }\n            h1 { font-size: 24px; }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h1>{{ baslik }}<\/h1>\n        <p>{{ icerik }}<\/p>\n        <hr>\n        <small>Yazar: {{ yazar }}<\/small>\n    <\/div>\n<\/body>\n<\/html>\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu HTML dosyas\u0131nda, <code>{{ baslik }}<\/code>, <code>{{ icerik }}<\/code> ve <code>{{ yazar }}<\/code> gibi \u00e7ift s\u00fcsl\u00fc parantezlerle i\u015faretlenmi\u015f yer tutucular\u0131 g\u00f6rebilirsiniz. Bunlar, Django \u015fablon dilinin de\u011fi\u015fkenleridir. G\u00f6r\u00fcn\u00fcmden g\u00f6nderdi\u011fimiz verilerle bu yer tutucular doldurulacakt\u0131r. Ayr\u0131ca, basit bir stil ve temel mobil uyumluluk \u00f6rne\u011fi olarak <code>@media<\/code> sorgusu eklenmi\u015ftir; bu, sayfan\u0131n farkl\u0131 ekran boyutlar\u0131nda nas\u0131l g\u00f6r\u00fcnece\u011fini kontrol etmenin bir yoludur.<\/p>\n<ol start=\"2\">\n<li><strong><code>views.py<\/code> Dosyas\u0131nda G\u00f6r\u00fcn\u00fcm\u00fc G\u00fcncelleme:<\/strong><br \/>\n        \u015eimdi <code>views.py<\/code> dosyam\u0131z\u0131 g\u00fcncelleyerek bu \u015fablonu kullanal\u0131m.<\/li>\n<\/ol>\n<pre><code>\n# myapp\/views.py\nfrom django.shortcuts import render\n# from django.http import HttpResponse # Art\u0131k do\u011frudan HttpResponse kullanmayaca\u011f\u0131z\n\ndef blog_detay(request, blog_id):\n    \"\"\"\n    Belirli bir blog g\u00f6nderisinin detaylar\u0131n\u0131 g\u00f6steren g\u00f6r\u00fcn\u00fcm.\n    Veritaban\u0131ndan veri \u00e7ekme sim\u00fclasyonu yap\u0131yoruz.\n    \"\"\"\n    # Ger\u00e7ek bir uygulamada burada veritaban\u0131ndan blog_id'ye g\u00f6re veri \u00e7ekilirdi.\n    # \u015eimdilik statik veri kullan\u0131yoruz.\n    if blog_id == 1:\n        blog_gonderisi = {\n            'baslik': 'Django ile Web Geli\u015ftirme Harikalar\u0131',\n            'icerik': 'Django, Python tabanl\u0131 bir web \u00e7at\u0131s\u0131d\u0131r ve h\u0131zl\u0131 geli\u015ftirme i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu makalede, Django\\'nun g\u00fcc\u00fcn\u00fc ve esnekli\u011fini ke\u015ffedece\u011fiz.',\n            'yazar': 'Ahmet Y\u0131lmaz'\n        }\n    elif blog_id == 2:\n        blog_gonderisi = {\n            'baslik': 'Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmlerin G\u00fcc\u00fc',\n            'icerik': 'FBV\\'ler, Django\\'da basit ve okunabilir kodlar yazmak i\u00e7in m\u00fckemmel bir yoldur. Kontrol tamamen sizin elinizde!',\n            'yazar': 'Ay\u015fe Demir'\n        }\n    else:\n        # E\u011fer blog_id bulunamazsa 404 hatas\u0131 d\u00f6nd\u00fcrebiliriz\n        # from django.http import Http404\n        # raise Http404(\"Blog g\u00f6nderisi bulunamad\u0131.\")\n        blog_gonderisi = {\n            'baslik': 'G\u00f6nderi Bulunamad\u0131',\n            'icerik': '\u00dczg\u00fcn\u00fcz, arad\u0131\u011f\u0131n\u0131z blog g\u00f6nderisi mevcut de\u011fil.',\n            'yazar': 'Sistem'\n        }\n\n    context = {\n        'baslik': blog_gonderisi['baslik'],\n        'icerik': blog_gonderisi['icerik'],\n        'yazar': blog_gonderisi['yazar'],\n    }\n    return render(request, 'blog_detay.html', context)\n\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>blog_detay<\/code> fonksiyonu, URL'den <code>blog_id<\/code> ad\u0131nda bir parametre al\u0131yor. Bu parametreye g\u00f6re sahte bir blog g\u00f6nderisi se\u00e7iyoruz. Daha sonra bu g\u00f6nderinin ba\u015fl\u0131k, i\u00e7erik ve yazar bilgilerini bir <code>context<\/code> s\u00f6zl\u00fc\u011f\u00fc i\u00e7ine yerle\u015ftiriyoruz. Son olarak, <code>render<\/code> fonksiyonunu \u00e7a\u011f\u0131rarak <code>request<\/code>, \u015fablonumuzun ad\u0131 (<code>'blog_detay.html'<\/code>) ve <code>context<\/code> s\u00f6zl\u00fc\u011f\u00fcn\u00fc iletiyoruz. Django, bu <code>context<\/code> s\u00f6zl\u00fc\u011f\u00fcndeki anahtarlar\u0131 \u015fablon i\u00e7indeki de\u011fi\u015fkenlerle e\u015fle\u015ftirecek ve son HTML'i olu\u015fturup kullan\u0131c\u0131ya g\u00f6nderecektir.<\/p>\n<ol start=\"3\">\n<li><strong><code>urls.py<\/code> Dosyas\u0131nda G\u00f6r\u00fcn\u00fcm\u00fc Yap\u0131land\u0131rma:<\/strong><br \/>\n        <code>urls.py<\/code> dosyam\u0131z\u0131 g\u00fcncelleyerek <code>blog_detay<\/code> g\u00f6r\u00fcn\u00fcm\u00fcn\u00fcze parametre alacak bir URL kal\u0131b\u0131 ekleyelim.<\/li>\n<\/ol>\n<pre><code>\n# myapp\/urls.py\nfrom django.urls import path\nfrom . import views\n\nurlpatterns = [\n    path('merhaba\/', views.merhaba_dunya, name='merhaba_dunya'),\n    path('blog\/<int:blog_id>\/', views.blog_detay, name='blog_detay'), # Yeni URL kal\u0131b\u0131m\u0131z\n]\n\n<\/pre>\n<p><\/code><\/p>\n<p><code>path('blog\/<int:blog_id>\/', ...)<\/code> kal\u0131b\u0131, Django'ya, <code>\/blog\/<\/code> ile ba\u015flayan ve ard\u0131ndan bir tam say\u0131 (<code><int:blog_id><\/code>) gelen her URL'in <code>blog_detay<\/code> g\u00f6r\u00fcn\u00fcm\u00fcne y\u00f6nlendirilmesini s\u00f6yler. <code><int:blog_id><\/code> k\u0131sm\u0131, URL'den gelen tam say\u0131y\u0131 alacak ve bunu <code>blog_id<\/code> ad\u0131yla <code>blog_detay<\/code> fonksiyonuna parametre olarak iletecektir. Art\u0131k taray\u0131c\u0131n\u0131zdan <code>http:\/\/127.0.0.1:8000\/uygulama\/blog\/1\/<\/code> veya <code>http:\/\/127.0.0.1:8000\/uygulama\/blog\/2\/<\/code> adreslerine gitti\u011finizde, dinamik olarak olu\u015fturulmu\u015f blog detay sayfalar\u0131n\u0131 g\u00f6receksiniz. Bu, FBV'ler arac\u0131l\u0131\u011f\u0131yla dinamik i\u00e7erik sunman\u0131n temelini olu\u015fturur ve ger\u00e7ek d\u00fcnya uygulamalar\u0131nda s\u0131k\u00e7a kullan\u0131lan bir y\u00f6ntemdir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir \u0130leti\u015fim Formu ve Veri \u0130\u015fleme FBV ile Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\u015eimdiye kadar, dinamik i\u00e7erik g\u00f6r\u00fcnt\u00fclemeyi ve URL parametrelerini kullanmay\u0131 \u00f6\u011frendik. Ancak web uygulamalar\u0131 sadece bilgi g\u00f6stermekle kalmaz, ayn\u0131 zamanda kullan\u0131c\u0131lardan bilgi almay\u0131 da gerektirir. Bir ileti\u015fim formu, bu t\u00fcr bir veri etkile\u015fiminin klasik bir \u00f6rne\u011fidir. Django'da bir ileti\u015fim formunu FBV'ler arac\u0131l\u0131\u011f\u0131yla nas\u0131l i\u015fleyece\u011fimize odaklanaca\u011f\u0131z. Bu, hem GET hem de POST isteklerini ele almay\u0131, form do\u011frulamay\u0131 ve kullan\u0131c\u0131 geri bildirimini i\u00e7erir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Django'nun form API'si, form do\u011frulamay\u0131 ve HTML olu\u015fturmay\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. Ger\u00e7ek projelerde her zaman bu API'yi kullanmaya \u00e7al\u0131\u015f\u0131n. G\u00fcvenlik ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in kritik \u00f6neme sahiptir.\n<\/div>\n<ol>\n<li><strong>Django Formu Olu\u015fturma:<\/strong><br \/>\n        \u00d6ncelikle, uygulaman\u0131z\u0131n ana dizininde <code>forms.py<\/code> ad\u0131nda yeni bir dosya olu\u015ftural\u0131m ve ileti\u015fim formumuzu tan\u0131mlayal\u0131m.<\/li>\n<\/ol>\n<pre><code>\n# myapp\/forms.py\nfrom django import forms\n\nclass IletisimFormu(forms.Form):\n    isim = forms.CharField(label='Ad\u0131n\u0131z', max_length=100)\n    email = forms.EmailField(label='E-posta Adresiniz')\n    konu = forms.CharField(label='Konu', max_length=200)\n    mesaj = forms.CharField(label='Mesaj\u0131n\u0131z', widget=forms.Textarea)\n\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>IletisimFormu<\/code> s\u0131n\u0131f\u0131, Django'nun <code>forms.Form<\/code> s\u0131n\u0131f\u0131ndan miras al\u0131r ve ileti\u015fim formumuz i\u00e7in d\u00f6rt alan (isim, email, konu, mesaj) tan\u0131mlar. <code>widget=forms.Textarea<\/code>, 'mesaj' alan\u0131 i\u00e7in HTML'de bir <code>textarea<\/code> elementi olu\u015fturulmas\u0131n\u0131 sa\u011flar. Django formlar\u0131, alanlar\u0131n t\u00fcr\u00fcn\u00fc ve do\u011frulama kurallar\u0131n\u0131 (\u00f6rne\u011fin, <code>max_length<\/code>, <code>EmailField<\/code>'in e-posta format\u0131 kontrol\u00fc) otomatik olarak y\u00f6netir.<\/p>\n<ol start=\"2\">\n<li><strong><code>views.py<\/code> Dosyas\u0131nda \u0130leti\u015fim Formu G\u00f6r\u00fcn\u00fcm\u00fcn\u00fc Olu\u015fturma:<\/strong><br \/>\n        \u015eimdi <code>views.py<\/code> dosyam\u0131za bu formu i\u015fleyecek yeni bir FBV ekleyelim.<\/li>\n<\/ol>\n<pre><code>\n# myapp\/views.py\nfrom django.shortcuts import render, redirect\nfrom .forms import IletisimFormu # Yeni olu\u015fturdu\u011fumuz formu i\u00e7e aktar\u0131yoruz\nfrom django.contrib import messages # Kullan\u0131c\u0131ya mesaj g\u00f6stermek i\u00e7in\n\ndef iletisim(request):\n    \"\"\"\n    Kullan\u0131c\u0131lardan ileti\u015fim formu arac\u0131l\u0131\u011f\u0131yla mesaj alan g\u00f6r\u00fcn\u00fcm.\n    GET ve POST isteklerini i\u015fler.\n    \"\"\"\n    if request.method == 'POST':\n        # Form g\u00f6nderildiyse, g\u00f6nderilen verilerle formu doldur\n        form = IletisimFormu(request.POST)\n        if form.is_valid():\n            # Form verileri ge\u00e7erliyse, i\u015flemleri yap\n            # \u00d6rne\u011fin, e-posta g\u00f6nder, veritaban\u0131na kaydet vb.\n            isim = form.cleaned_data['isim']\n            email = form.cleaned_data['email']\n            konu = form.cleaned_data['konu']\n            mesaj = form.cleaned_data['mesaj']\n\n            # Buraya e-posta g\u00f6nderme veya veritaban\u0131na kaydetme kodu gelebilir.\n            print(f\"Yeni Mesaj: {isim} ({email}) - Konu: {konu}\\nMesaj: {mesaj}\")\n\n            messages.success(request, 'Mesaj\u0131n\u0131z ba\u015far\u0131yla g\u00f6nderildi, te\u015fekk\u00fcr ederiz!')\n            return redirect('iletisim_basarili') # Ba\u015far\u0131l\u0131 bir sayfaya y\u00f6nlendir\n\n    else:\n        # Form ilk kez a\u00e7\u0131l\u0131yorsa veya GET iste\u011fi ise bo\u015f bir form g\u00f6ster\n        form = IletisimFormu()\n\n    context = {\n        'form': form,\n        'sayfa_baslik': 'Bize Ula\u015f\u0131n'\n    }\n    return render(request, 'iletisim.html', context)\n\ndef iletisim_basarili(request):\n    \"\"\"\n    \u0130leti\u015fim formunun ba\u015far\u0131yla g\u00f6nderildi\u011fini belirten g\u00f6r\u00fcn\u00fcm.\n    \"\"\"\n    return render(request, 'iletisim_basarili.html', {'sayfa_baslik': 'Mesaj\u0131n\u0131z G\u00f6nderildi'})\n\n<\/pre>\n<p><\/code><\/p>\n<p><code>iletisim<\/code> FBV'si, <code>request.method == 'POST'<\/code> kontrol\u00fc ile gelen iste\u011fin tipini kontrol eder. E\u011fer istek POST ise (yani form g\u00f6nderilmi\u015fse), <code>IletisimFormu(request.POST)<\/code> ile formu g\u00f6nderilen verilerle doldururuz. Ard\u0131ndan <code>form.is_valid()<\/code> ile verilerin ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 kontrol ederiz. E\u011fer ge\u00e7erliyse, <code>form.cleaned_data<\/code> ile g\u00fcvenli ve temizlenmi\u015f verilere eri\u015firiz. Bu verilerle bir e-posta g\u00f6nderebilir veya veritaban\u0131na kaydedebiliriz. Ba\u015far\u0131l\u0131 bir g\u00f6nderimin ard\u0131ndan <code>messages.success<\/code> ile kullan\u0131c\u0131ya bir geri bildirim g\u00f6sterir ve <code>redirect<\/code> ile ba\u015fka bir sayfaya y\u00f6nlendiririz. E\u011fer istek GET ise, yani sayfa ilk kez a\u00e7\u0131l\u0131yorsa, bo\u015f bir form olu\u015fturur ve \u015fablona g\u00f6ndeririz.<\/p>\n<ol start=\"3\">\n<li><strong>\u015eablon Dosyas\u0131 Olu\u015fturma:<\/strong><br \/>\n        <code>myapp\/templates\/<\/code> klas\u00f6r\u00fcne <code>iletisim.html<\/code> ve <code>iletisim_basarili.html<\/code> ad\u0131nda iki dosya olu\u015ftural\u0131m.<\/li>\n<\/ol>\n<pre><code>\n<!-- myapp\/templates\/iletisim.html -->\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>{{ sayfa_baslik }}<\/title>\n    <style>\n        body { font-family: 'Arial', sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }\n        .container { max-width: 600px; margin: auto; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }\n        h1 { color: #0056b3; margin-bottom: 20px; }\n        form div { margin-bottom: 15px; }\n        label { display: block; margin-bottom: 5px; font-weight: bold; }\n        input[type=\"text\"], input[type=\"email\"], textarea {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            box-sizing: border-box; \/* Padding ve border geni\u015fli\u011fe dahil olsun *\/\n        }\n        textarea { resize: vertical; min-height: 100px; }\n        button {\n            background-color: #28a745;\n            color: white;\n            padding: 10px 20px;\n            border: none;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 16px;\n        }\n        button:hover { background-color: #218838; }\n        .errorlist { color: red; list-style-type: none; padding: 0; margin-top: 5px; }\n        .messages { list-style-type: none; padding: 0; margin-bottom: 20px; }\n        .messages li {\n            padding: 10px;\n            margin-bottom: 10px;\n            border-radius: 4px;\n        }\n        .messages .success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h1>{{ sayfa_baslik }}<\/h1>\n\n        {% if messages %}\n            <ul class=\"messages\">\n                {% for message in messages %}\n                    <li{% if message.tags %} class=\"{{ message.tags }}\"{% endif %}>{{ message }}<\/li>\n                {% endfor %}\n            <\/ul>\n        {% endif %}\n\n        <form method=\"post\">\n            {% csrf_token %} <!-- G\u00fcvenlik i\u00e7in olmazsa olmaz -->\n            {{ form.as_p }} <!-- Formu paragraf etiketleri i\u00e7inde render eder -->\n            <button type=\"submit\">Mesaj G\u00f6nder<\/button>\n        <\/form>\n    <\/div>\n<\/body>\n<\/html>\n\n<\/pre>\n<p><\/code><\/p>\n<pre><code>\n<!-- myapp\/templates\/iletisim_basarili.html -->\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>{{ sayfa_baslik }}<\/title>\n    <style>\n        body { font-family: 'Arial', sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }\n        .container { max-width: 600px; margin: auto; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); text-align: center; }\n        h1 { color: #28a745; margin-bottom: 20px; }\n        p { line-height: 1.6; margin-bottom: 15px; }\n        a { color: #0056b3; text-decoration: none; }\n        a:hover { text-decoration: underline; }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h1>Te\u015fekk\u00fcr Ederiz!<\/h1>\n        <p>Mesaj\u0131n\u0131z ba\u015far\u0131yla al\u0131nm\u0131\u015ft\u0131r. En k\u0131sa s\u00fcrede sizinle ileti\u015fime ge\u00e7ilecektir.<\/p>\n        <p><a href=\"{% url 'iletisim' %}\">Ba\u015fka bir mesaj g\u00f6ndermek ister misiniz?<\/a><\/p>\n    <\/div>\n<\/body>\n<\/html>\n\n<\/pre>\n<p><\/code><\/p>\n<p><code>iletisim.html<\/code> \u015fablonunda <code>{% csrf_token %}<\/code> etiketinin g\u00fcvenlik i\u00e7in \u00e7ok \u00f6nemli oldu\u011funu unutmay\u0131n. Bu etiket, Cross-Site Request Forgery (CSRF) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flar. <code>{{ form.as_p }}<\/code> ise formu otomatik olarak HTML paragraflar\u0131 i\u00e7inde render eder. \u015eablon ayr\u0131ca Django'nun mesaj \u00e7er\u00e7evesini kullanarak kullan\u0131c\u0131ya ba\u015far\u0131 veya hata mesajlar\u0131n\u0131 g\u00f6stermek i\u00e7in bir b\u00f6l\u00fcm i\u00e7erir.<\/p>\n<ol start=\"4\">\n<li><strong><code>urls.py<\/code> Dosyas\u0131nda G\u00f6r\u00fcn\u00fcm\u00fc Yap\u0131land\u0131rma:<\/strong><br \/>\n        Son olarak, bu yeni g\u00f6r\u00fcn\u00fcmleri URL yap\u0131m\u0131za ekleyelim.<\/li>\n<\/ol>\n<pre><code>\n# myapp\/urls.py\nfrom django.urls import path\nfrom . import views\n\nurlpatterns = [\n    path('merhaba\/', views.merhaba_dunya, name='merhaba_dunya'),\n    path('blog\/<int:blog_id>\/', views.blog_detay, name='blog_detay'),\n    path('iletisim\/', views.iletisim, name='iletisim'), # \u0130leti\u015fim formu\n    path('iletisim\/basarili\/', views.iletisim_basarili, name='iletisim_basarili'), # \u0130leti\u015fim ba\u015far\u0131 sayfas\u0131\n]\n\n<\/pre>\n<p><\/code><\/p>\n<p>Projenizi \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra <code>http:\/\/127.0.0.1:8000\/uygulama\/iletisim\/<\/code> adresine giderek formu test edebilirsiniz. Ge\u00e7erli verilerle g\u00f6nderim yapt\u0131\u011f\u0131n\u0131zda <code>iletisim_basarili<\/code> sayfas\u0131na y\u00f6nlendirildi\u011finizi ve mesaj\u0131n konsola yazd\u0131r\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rmelisiniz. Hatal\u0131 veri giri\u015fi yapt\u0131\u011f\u0131n\u0131zda ise formun alt\u0131nda do\u011frulama hatalar\u0131n\u0131 g\u00f6receksiniz. Bu senaryo, FBV'lerin kullan\u0131c\u0131 giri\u015fi, do\u011frulama ve veri i\u015fleme gibi karma\u015f\u0131k s\u00fcre\u00e7leri nas\u0131l y\u00f6netti\u011fini somut bir \u015fekilde g\u00f6stermektedir.<\/p>\n<h2>FBV'lerde Yetkilendirme (Authentication) ve \u0130zinler (Permissions) Nas\u0131l Uygulan\u0131r?<\/h2>\n<p>Web uygulamalar\u0131nda kullan\u0131c\u0131lar\u0131n belirli sayfalara veya i\u015flemlere eri\u015fimini kontrol etmek kritik \u00f6neme sahiptir. Django, bu yetkilendirme ve izin y\u00f6netimi ihtiya\u00e7lar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc bir sistem sunar. Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBVs) ile bu g\u00fcvenlik katmanlar\u0131n\u0131 uygulamak olduk\u00e7a kolayd\u0131r, zira Python dekorat\u00f6rleri sayesinde g\u00f6r\u00fcn\u00fcmlerinizi sararak ek i\u015flevsellik ekleyebilirsiniz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Django'nun yerle\u015fik yetkilendirme dekorat\u00f6rleri (<code>@login_required<\/code>, <code>@permission_required<\/code>) sadece i\u015finizi kolayla\u015ft\u0131rmakla kalmaz, ayn\u0131 zamanda g\u00fcvenlik standartlar\u0131n\u0131 da y\u00fckseltir. \u00d6zel dekorat\u00f6rler yazmadan \u00f6nce bu yerle\u015fik ara\u00e7lar\u0131 kullanmaya \u00e7al\u0131\u015f\u0131n.\n<\/div>\n<h3>Kullan\u0131c\u0131 Giri\u015fi Gerektiren Sayfalar \u0130\u00e7in <code>@login_required<\/code> Dekorasyonu<\/h3>\n<p>\u00c7o\u011fu web uygulamas\u0131nda, belirli bir i\u00e7eri\u011fi g\u00f6rmek veya bir i\u015flemi yapmak i\u00e7in kullan\u0131c\u0131n\u0131n oturum a\u00e7m\u0131\u015f olmas\u0131 gerekir. Django'nun <code>@login_required<\/code> dekorat\u00f6r\u00fc, bir FBV'nin yaln\u0131zca oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar taraf\u0131ndan eri\u015filebilir olmas\u0131n\u0131 sa\u011flaman\u0131n en basit yoludur. E\u011fer oturum a\u00e7mam\u0131\u015f bir kullan\u0131c\u0131 bu g\u00f6r\u00fcn\u00fcme eri\u015fmeye \u00e7al\u0131\u015f\u0131rsa, otomatik olarak Django'nun varsay\u0131lan giri\u015f sayfas\u0131na y\u00f6nlendirilir.<\/p>\n<pre><code>\n# myapp\/views.py\nfrom django.shortcuts import render, redirect\nfrom django.contrib.auth.decorators import login_required\nfrom django.contrib import messages\n\n@login_required(login_url='\/accounts\/login\/') # Kullan\u0131c\u0131 giri\u015f yapmad\u0131ysa buraya y\u00f6nlendir\ndef kullanici_profili(request):\n    \"\"\"\n    Sadece oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar\u0131n kendi profil bilgilerini g\u00f6rebilece\u011fi g\u00f6r\u00fcn\u00fcm.\n    \"\"\"\n    return render(request, 'kullanici_profili.html', {\n        'kullanici': request.user, # Oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131n\u0131n bilgileri request.user nesnesinde bulunur\n        'sayfa_baslik': f'{request.user.username} Profil Sayfas\u0131'\n    })\n\n@login_required\ndef gizli_sayfa(request):\n    \"\"\"\n    Sadece oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar\u0131n g\u00f6rebilece\u011fi gizli bir sayfa.\n    \"\"\"\n    # Herhangi bir \u00f6zel login_url belirtilmezse, Django ayarlar\u0131ndaki LOGIN_URL kullan\u0131l\u0131r.\n    messages.info(request, \"Gizli sayfay\u0131 ziyaret etti\u011finiz i\u00e7in te\u015fekk\u00fcrler!\")\n    return render(request, 'gizli_sayfa.html', {'sayfa_baslik': 'Gizli Bilgiler'})\n\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>kullanici_profili<\/code> ve <code>gizli_sayfa<\/code> g\u00f6r\u00fcn\u00fcmleri <code>@login_required<\/code> dekorat\u00f6r\u00fc ile sar\u0131lm\u0131\u015ft\u0131r. <code>login_url<\/code> parametresi ile, kullan\u0131c\u0131 giri\u015f yapmad\u0131\u011f\u0131nda y\u00f6nlendirilecek \u00f6zel bir URL belirtebiliriz. Belirtilmezse, Django'nun <code>settings.py<\/code> dosyas\u0131ndaki <code>LOGIN_URL<\/code> ayar\u0131 kullan\u0131l\u0131r (genellikle <code>\/accounts\/login\/<\/code>). <code>request.user<\/code> nesnesi, oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131n\u0131n bilgilerine eri\u015fmenizi sa\u011flar. Bu sayede, profil sayfas\u0131nda kullan\u0131c\u0131n\u0131n ad\u0131, e-posta adresi gibi bilgilerini kolayca g\u00f6r\u00fcnt\u00fcleyebilirsiniz.<\/p>\n<h3>Belirli \u0130zinler Gerektiren Sayfalar \u0130\u00e7in <code>@permission_required<\/code> Dekorasyonu<\/h3>\n<p>Baz\u0131 durumlarda, sadece oturum a\u00e7m\u0131\u015f olmak yeterli de\u011fildir; kullan\u0131c\u0131n\u0131n belirli bir i\u015flemi yapmaya veya belirli bir kayna\u011fa eri\u015fmeye yetkili olmas\u0131 da gerekebilir. \u00d6rne\u011fin, bir blog g\u00f6nderisini d\u00fczenlemek i\u00e7in kullan\u0131c\u0131n\u0131n \"blog.change_post\" iznine sahip olmas\u0131 gerekebilir. Django'nun <code>@permission_required<\/code> dekorat\u00f6r\u00fc, bu t\u00fcr durumlar i\u00e7in idealdir.<\/p>\n<pre><code>\n# myapp\/views.py\nfrom django.shortcuts import render, redirect, get_object_or_404\nfrom django.contrib.auth.decorators import permission_required\nfrom .models import Post # Diyelim ki Post ad\u0131nda bir modeliniz var\nfrom django.contrib import messages\n\n@permission_required('myapp.change_post', raise_exception=True) # Kullan\u0131c\u0131n\u0131n 'myapp.change_post' izni olmal\u0131\ndef gonderi_duzenle(request, post_id):\n    \"\"\"\n    Sadece belirli bir izne sahip kullan\u0131c\u0131lar\u0131n blog g\u00f6nderilerini d\u00fczenleyebilece\u011fi g\u00f6r\u00fcn\u00fcm.\n    \"\"\"\n    post = get_object_or_404(Post, pk=post_id)\n    # Form i\u015fleme mant\u0131\u011f\u0131 buraya gelir\n    if request.method == 'POST':\n        # Formu i\u015fle ve kaydet\n        messages.success(request, f\"'{post.title}' ba\u015far\u0131yla g\u00fcncellendi.\")\n        return redirect('post_detail', post_id=post.id)\n    \n    # Formu g\u00f6ster\n    return render(request, 'gonderi_duzenle.html', {'post': post, 'sayfa_baslik': f'G\u00f6nderi D\u00fczenle: {post.title}'})\n\n<\/pre>\n<p><\/code><\/p>\n<p><code>@permission_required('myapp.change_post', raise_exception=True)<\/code> dekorat\u00f6r\u00fc, kullan\u0131c\u0131n\u0131n <code>myapp<\/code> uygulamas\u0131nda <code>change_post<\/code> iznine sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer kullan\u0131c\u0131 bu izne sahip de\u011filse ve <code>raise_exception=True<\/code> olarak ayarland\u0131ysa, Django varsay\u0131lan olarak bir 403 (Forbidden) hatas\u0131 d\u00f6nd\u00fcrecektir. Aksi takdirde, kullan\u0131c\u0131y\u0131 <code>LOGIN_URL<\/code>'e benzer \u015fekilde bir hata sayfas\u0131na y\u00f6nlendirebilirsiniz. Bu sayede, hassas i\u015flemleri sadece yetkili kullan\u0131c\u0131lar\u0131n ger\u00e7ekle\u015ftirebilmesini sa\u011flayarak uygulaman\u0131z\u0131n g\u00fcvenli\u011fini art\u0131rm\u0131\u015f olursunuz. \u0130zinler genellikle Django'nun admin paneli arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131 ve gruplara atan\u0131r.<\/p>\n<p>Bu dekorat\u00f6rler, FBV'leriniz i\u00e7in g\u00fc\u00e7l\u00fc bir g\u00fcvenlik katman\u0131 olu\u015fturman\u0131za olanak tan\u0131r. Kodunuzun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 da kolayla\u015ft\u0131r\u0131r, \u00e7\u00fcnk\u00fc yetkilendirme mant\u0131\u011f\u0131 g\u00f6r\u00fcn\u00fcm fonksiyonunun ana kod blo\u011fundan ayr\u0131lm\u0131\u015f olur. Unutmay\u0131n, bu dekorat\u00f6rler sadece oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar i\u00e7in ge\u00e7erlidir. Anonim kullan\u0131c\u0131lar\u0131n eri\u015fimini y\u00f6netmek i\u00e7in ba\u015fka stratejiler (\u00f6rne\u011fin, g\u00f6r\u00fcn\u00fcm i\u00e7inde manuel kontroller) kullanman\u0131z gerekebilir.<\/p>\n<h2>Sonu\u00e7: Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmlerin Esnekli\u011fi ve G\u00fcc\u00fc<\/h2>\n<p>Bu kapsaml\u0131 makale boyunca, Django'nun Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmlerinin (FBV'ler) ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve web uygulamalar\u0131n\u0131zda nas\u0131l etkili bir \u015fekilde kullan\u0131labilece\u011fini derinlemesine inceledik. Basit \"Merhaba D\u00fcnya\" \u00f6rneklerinden dinamik \u015fablon kullan\u0131m\u0131na, kullan\u0131c\u0131 girdilerini i\u015fleyen formlardan yetkilendirme ve izin y\u00f6netimine kadar bir\u00e7ok farkl\u0131 senaryoyu ele ald\u0131k. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, FBV'ler, Python'\u0131n fonksiyonel programlama g\u00fcc\u00fcn\u00fc kullanarak okunabilir, esnek ve kontrol edilebilir web g\u00f6r\u00fcn\u00fcmleri olu\u015fturmak i\u00e7in ideal bir ara\u00e7t\u0131r.<\/p>\n<p>FBV'ler, \u00f6zellikle projenizin ba\u015flang\u0131\u00e7 a\u015famalar\u0131nda veya belirli bir iste\u011fin ya\u015fam d\u00f6ng\u00fcs\u00fc \u00fczerinde tam kontrol sahibi olmak istedi\u011finiz karma\u015f\u0131k mant\u0131klar i\u00e7in m\u00fcthi\u015f bir kolayl\u0131k sa\u011flar. Her bir HTTP metodunu (GET, POST) ayr\u0131 ayr\u0131 ele alma yetene\u011fi, form verilerini do\u011frulama ve i\u015fleme s\u00fcreci, \u015fablonlarla dinamik HTML \u00fcretimi ve dekorat\u00f6rler arac\u0131l\u0131\u011f\u0131yla kolayca g\u00fcvenlik katmanlar\u0131 ekleyebilme \u00f6zellikleri, FBV'lerin g\u00fcc\u00fcn\u00fc ve \u00e7ok y\u00f6nl\u00fcl\u00fc\u011f\u00fcn\u00fc ortaya koymaktad\u0131r. Mobil uyumlu tasar\u0131m\u0131n \u00f6nemini de vurgulayarak, HTML \u015fablonlar\u0131m\u0131zda temel responsive CSS yakla\u015f\u0131mlar\u0131n\u0131 nas\u0131l d\u00fc\u015f\u00fcnebilece\u011fimize dair ipu\u00e7lar\u0131 sunduk. Django'nun sundu\u011fu bu temel yap\u0131 ta\u015f\u0131n\u0131 ustal\u0131kla kullanarak, h\u0131zl\u0131 ve g\u00fcvenli web uygulamalar\u0131 geli\u015ftirebilir, kullan\u0131c\u0131lar\u0131n\u0131za zengin deneyimler sunabilirsiniz. Unutmay\u0131n, prati\u011fe d\u00f6kmek, \u00f6\u011frenmenin en iyi yoludur!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV) ve S\u0131n\u0131f Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (CBV) aras\u0131ndaki temel fark nedir?<\/strong><\/p>\n<p>FBV'ler, Python fonksiyonlar\u0131 olarak tan\u0131mlan\u0131r ve her bir HTTP metodunu (GET, POST) manuel olarak kontrol etmenizi sa\u011flar. Daha basit ve do\u011frudan bir yap\u0131 sunarlar. CBV'ler ise Python s\u0131n\u0131flar\u0131 olarak tan\u0131mlan\u0131r ve kal\u0131t\u0131m ile mixin'ler kullanarak daha az kodla daha fazla i\u015f yapman\u0131z\u0131 sa\u011flayan genel (generic) g\u00f6r\u00fcn\u00fcmler sunar. Daha karma\u015f\u0131k senaryolar ve yeniden kullan\u0131labilirlik i\u00e7in CBV'ler tercih edilebilirken, FBV'ler basitlik ve tam kontrol sunduklar\u0131 i\u00e7in s\u0131k\u00e7a kullan\u0131l\u0131r.<\/p>\n<p><strong>2. FBV'lerde form i\u015fleme s\u0131ras\u0131nda g\u00fcvenlik i\u00e7in neye dikkat etmeliyim?<\/strong><\/p>\n<p>FBV'lerde form i\u015flerken en \u00f6nemli g\u00fcvenlik ad\u0131mlar\u0131ndan biri <code>{% csrf_token %}<\/code> etiketini formunuza eklemektir. Bu, Cross-Site Request Forgery (CSRF) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flar. Ayr\u0131ca, kullan\u0131c\u0131dan gelen verileri do\u011frudan kullanmak yerine, Django'nun form API'si arac\u0131l\u0131\u011f\u0131yla <code>form.is_valid()<\/code> ve <code>form.cleaned_data<\/code> kullanarak verilerin do\u011frulanm\u0131\u015f ve temizlenmi\u015f oldu\u011fundan emin olmal\u0131s\u0131n\u0131z.<\/p>\n<p><strong>3. Bir FBV'den ba\u015fka bir URL'ye nas\u0131l y\u00f6nlendirme yapabilirim?<\/strong><\/p>\n<p>Bir FBV'den ba\u015fka bir URL'ye y\u00f6nlendirme yapmak i\u00e7in <code>django.shortcuts<\/code> mod\u00fcl\u00fcndeki <code>redirect<\/code> fonksiyonunu kullanabilirsiniz. Bu fonksiyon, bir URL dizesini, bir model nesnesini veya bir URL kal\u0131b\u0131n\u0131n ad\u0131n\u0131 (<code>name<\/code> parametresi ile tan\u0131mlanm\u0131\u015f) alabilir. \u00d6rne\u011fin: <code>return redirect('\/success_page\/')<\/code> veya <code>return redirect('my_app:success_view_name')<\/code>.<\/p>\n<p><strong>4. FBV'lerde veritaban\u0131 sorgular\u0131 nas\u0131l yap\u0131l\u0131r?<\/strong><\/p>\n<p>FBV'lerde veritaban\u0131 sorgular\u0131, Django'nun ORM (Object-Relational Mapper) arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r. Modelinizi (\u00f6rne\u011fin, <code>Post<\/code>) i\u00e7e aktard\u0131ktan sonra, \u00e7e\u015fitli sorgu y\u00f6ntemlerini kullanabilirsiniz: <code>Post.objects.all()<\/code> (t\u00fcm g\u00f6nderileri getirir), <code>Post.objects.get(id=1)<\/code> (belirli bir id'ye sahip g\u00f6nderiyi getirir), <code>Post.objects.filter(yazar='Ahmet')<\/code> (filtreleme yapar) gibi. Sorgu sonu\u00e7lar\u0131 genellikle bir \u015fablon ba\u011flam\u0131 olarak \u015fablona iletilir.<\/p>\n<p><strong>5. Mobil uyumlu web siteleri i\u00e7in FBV'lerde \u00f6zel bir \u015fey yapmam gerekiyor mu?<\/strong><\/p>\n<p>FBV'ler arka u\u00e7ta \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in do\u011frudan mobil uyumluluk (responsive design) ile ilgilenmezler. Mobil uyumluluk, daha \u00e7ok \u00f6n u\u00e7 (frontend) geli\u015ftirme ile ilgilidir (HTML yap\u0131s\u0131, CSS medya sorgular\u0131, JavaScript). Ancak, FBV'lerinizden g\u00f6nderdi\u011finiz HTML \u015fablonlar\u0131n\u0131n ve ba\u011flam verilerinin, \u00f6n u\u00e7 geli\u015ftiricilerin mobil uyumlu tasar\u0131mlar olu\u015fturmas\u0131n\u0131 kolayla\u015ft\u0131racak \u015fekilde d\u00fczenli ve anlaml\u0131 olmas\u0131 \u00f6nemlidir. \u00d6rne\u011fin, farkl\u0131 cihazlar i\u00e7in farkl\u0131 \u015fablonlar render etme gibi mant\u0131klar FBV i\u00e7inde karar verilebilir, ancak genellikle CSS ve JavaScript ile halledilir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan Django, h\u0131zl\u0131 ve verimli uygulamalar olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7at\u0131 sunar.&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31080","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber<\/title>\n<meta name=\"description\" content=\"Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan Django, h\u0131zl\u0131 ve verimli uygulamalar olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7at\u0131 sunar. Peki, web sayfalar\u0131n\u0131z\u0131n dinamik i\u00e7eri\u011fini nas\u0131l y\u00f6netiyorsunuz? Kullan\u0131c\u0131lar\u0131n isteklerine yan\u0131t veren ve onlara anlaml\u0131 bilgiler sunan o b\u00fcy\u00fcl\u00fc arka plan i\u015flemlerini merak ediyor musunuz? \u0130\u015fte bu noktada Django&#039;nun Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (Function-Based Views - FBVs) devreye giriyor. Bu kapsaml\u0131 rehberde, FBV&#039;lerin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiricilerden deneyimli profesyonellere kadar herkesin faydalanabilece\u011fi pratik bilgilerle donat\u0131lm\u0131\u015f bu makale, Django FBV&#039;lerini ustal\u0131kla kullanman\u0131z i\u00e7in size yol g\u00f6sterecek.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber\" \/>\n<meta property=\"og:description\" content=\"Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan Django, h\u0131zl\u0131 ve verimli uygulamalar olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7at\u0131 sunar. Peki, web sayfalar\u0131n\u0131z\u0131n dinamik i\u00e7eri\u011fini nas\u0131l y\u00f6netiyorsunuz? Kullan\u0131c\u0131lar\u0131n isteklerine yan\u0131t veren ve onlara anlaml\u0131 bilgiler sunan o b\u00fcy\u00fcl\u00fc arka plan i\u015flemlerini merak ediyor musunuz? \u0130\u015fte bu noktada Django&#039;nun Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (Function-Based Views - FBVs) devreye giriyor. Bu kapsaml\u0131 rehberde, FBV&#039;lerin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiricilerden deneyimli profesyonellere kadar herkesin faydalanabilece\u011fi pratik bilgilerle donat\u0131lm\u0131\u015f bu makale, Django FBV&#039;lerini ustal\u0131kla kullanman\u0131z i\u00e7in size yol g\u00f6sterecek.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-05T10:01:35+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber\",\"datePublished\":\"2025-10-05T10:01:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/\"},\"wordCount\":3330,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/\",\"name\":\"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-05T10:01:35+00:00\",\"description\":\"Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan Django, h\u0131zl\u0131 ve verimli uygulamalar olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7at\u0131 sunar. Peki, web sayfalar\u0131n\u0131z\u0131n dinamik i\u00e7eri\u011fini nas\u0131l y\u00f6netiyorsunuz? Kullan\u0131c\u0131lar\u0131n isteklerine yan\u0131t veren ve onlara anlaml\u0131 bilgiler sunan o b\u00fcy\u00fcl\u00fc arka plan i\u015flemlerini merak ediyor musunuz? \u0130\u015fte bu noktada Django'nun Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (Function-Based Views - FBVs) devreye giriyor. Bu kapsaml\u0131 rehberde, FBV'lerin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiricilerden deneyimli profesyonellere kadar herkesin faydalanabilece\u011fi pratik bilgilerle donat\u0131lm\u0131\u015f bu makale, Django FBV'lerini ustal\u0131kla kullanman\u0131z i\u00e7in size yol g\u00f6sterecek.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber","description":"Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan Django, h\u0131zl\u0131 ve verimli uygulamalar olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7at\u0131 sunar. Peki, web sayfalar\u0131n\u0131z\u0131n dinamik i\u00e7eri\u011fini nas\u0131l y\u00f6netiyorsunuz? Kullan\u0131c\u0131lar\u0131n isteklerine yan\u0131t veren ve onlara anlaml\u0131 bilgiler sunan o b\u00fcy\u00fcl\u00fc arka plan i\u015flemlerini merak ediyor musunuz? \u0130\u015fte bu noktada Django'nun Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (Function-Based Views - FBVs) devreye giriyor. Bu kapsaml\u0131 rehberde, FBV'lerin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiricilerden deneyimli profesyonellere kadar herkesin faydalanabilece\u011fi pratik bilgilerle donat\u0131lm\u0131\u015f bu makale, Django FBV'lerini ustal\u0131kla kullanman\u0131z i\u00e7in size yol g\u00f6sterecek.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber","og_description":"Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan Django, h\u0131zl\u0131 ve verimli uygulamalar olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7at\u0131 sunar. Peki, web sayfalar\u0131n\u0131z\u0131n dinamik i\u00e7eri\u011fini nas\u0131l y\u00f6netiyorsunuz? Kullan\u0131c\u0131lar\u0131n isteklerine yan\u0131t veren ve onlara anlaml\u0131 bilgiler sunan o b\u00fcy\u00fcl\u00fc arka plan i\u015flemlerini merak ediyor musunuz? \u0130\u015fte bu noktada Django'nun Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (Function-Based Views - FBVs) devreye giriyor. Bu kapsaml\u0131 rehberde, FBV'lerin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiricilerden deneyimli profesyonellere kadar herkesin faydalanabilece\u011fi pratik bilgilerle donat\u0131lm\u0131\u015f bu makale, Django FBV'lerini ustal\u0131kla kullanman\u0131z i\u00e7in size yol g\u00f6sterecek.","og_url":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-05T10:01:35+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber","datePublished":"2025-10-05T10:01:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/"},"wordCount":3330,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/","name":"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-05T10:01:35+00:00","description":"Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan Django, h\u0131zl\u0131 ve verimli uygulamalar olu\u015fturmak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7at\u0131 sunar. Peki, web sayfalar\u0131n\u0131z\u0131n dinamik i\u00e7eri\u011fini nas\u0131l y\u00f6netiyorsunuz? Kullan\u0131c\u0131lar\u0131n isteklerine yan\u0131t veren ve onlara anlaml\u0131 bilgiler sunan o b\u00fcy\u00fcl\u00fc arka plan i\u015flemlerini merak ediyor musunuz? \u0130\u015fte bu noktada Django'nun Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (Function-Based Views - FBVs) devreye giriyor. Bu kapsaml\u0131 rehberde, FBV'lerin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l etkili bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiricilerden deneyimli profesyonellere kadar herkesin faydalanabilece\u011fi pratik bilgilerle donat\u0131lm\u0131\u015f bu makale, Django FBV'lerini ustal\u0131kla kullanman\u0131z i\u00e7in size yol g\u00f6sterecek.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/django-fonksiyon-tabanli-gorunumler-fbv-adim-adim-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Django Fonksiyon Tabanl\u0131 G\u00f6r\u00fcn\u00fcmler (FBV): Ad\u0131m Ad\u0131m Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31080","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31080"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31080\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31080"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31080"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31080"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}