Kurs
Django, yaygın olarak kullanılan, ücretsiz, açık kaynaklı ve üst düzey bir web geliştirme çatısıdır. Geliştiricilere pek çok özelliği "kutudan çıkar çıkmaz" sunar, bu sayede geliştirme hızlı ilerler. Bununla birlikte, ondan oluşturulan web siteleri aynı anda güvenli, ölçeklenebilir ve bakımı kolaydır.
Hedef
Bu eğitimin hedefi, blog içeriğinin bir yönetim paneli üzerinden oluşturulup güncellenebildiği bir blog uygulaması geliştirmektir. Blog içerikleri sayfada görüntülenir ve gerektiğinde silinebilir. Uygulama genel olarak CRUD (Create, Read, Update, Delete) işlevselliği sağlar.
Bu eğitimde Javascript, CSS vb. hiçbir FrontEnd teknolojisi kullanılmayacak; bunun yerine her Django Web Geliştirme sürecinde gerekli olan temel ama kritik kavramlara odaklanılacaktır.
Gerekli Kurulum
- Git Bash: Tüm işletim sistemi kullanıcıları kullanabilir. Django ile ilgili tüm komutlar ve Unix komutları bunun üzerinden yürütülür. Git Bash indirmek için: Tıklayın.
- Metin Düzenleyici: Sublime Text veya Visual Studio Code gibi herhangi bir metin düzenleyici kullanılabilir. Bu projede Sublime Text kullanılmıştır.
- Python 3: Python’un en son sürümünü buradan indirebilirsiniz: Download Python.
Not: Bu eğitimi, Python’un temellerini anlayıp döngüler, fonksiyonlar, sınıflar vb. konulara ve ayrıca bash ya da komut satırına dair biraz bilgi sahibiyseniz kolayca takip edebilirsiniz.
Sanal Ortam
Sanal ortam, Python ile ilgili projelerin bağımlılıklarını yönetir. Belirli bir projeye ait tüm Python paketlerinin ve gereken sürümlerin kurulduğu, kendi kendine yeten bir kap ya da izole bir ortam gibi çalışır. Python, Django veya paketlerin yeni sürümleri çıktıkça, sanal ortam sayesinde projenize özgü eski sürümlerle çalışabilirsiniz. Özetle, aynı bilgisayarda bir yandan Django 2.0 ile ilgili bağımsız bir proje başlatabilirken, diğer yandan Django 3.0 ile ilgili başka bir bağımsız projeye de başlayabilirsiniz.
Not: Sanal ortam oluşturmanın birçok yolu vardır, aşağıda yalnızca bir yöntem gösterilmiştir.
Sanal Ortam Oluşturma Adımları
- Masaüstünüzde 'mkdir' komutunu kullanarak 'project-blog' adlı yeni bir dizin oluşturabilirsiniz.
-
'cd' komutunu kullanarak dizini 'project-blog' olarak değiştirin.

-
Sanal ortam 'python -m venv env' komutuyla oluşturulur; burada env, 'ls' komutuyla görülen sanal ortamımızdır.

-
Sanal Ortamınızı Etkinleştirmek İçin: Sanal ortam, 'Scripts' klasörü etkinleştirilerek 'source' komutuyla etkinleştirilir.

Sanal ortamınızı başarıyla etkinleştirdiyseniz, parantez içinde 'env' görünecektir. - Django’nun Kurulması: Belirli sanal ortamınıza Django kurmak için 'pip install django' kullanabilirsiniz.

Not: Linux ve Mac kullanıcıları komutta özellikle 'python3' kullanmalıdır çünkü bilgisayarlarında Python 2 sürümü önceden yüklüdür. Ayrıca, 2020 yılından sonra Python 2 artık desteklenmediği için günümüzde 3. sürümü kullanmak tercih edilir.
Bir Django Projesi Oluşturma
- İlk adım, 'django-admin startproject
project_name' komutunu kullanarak projenizi oluşturmaktır; sizin durumunuzda 'project_name' 'django_blog' olacaktır. Ayrıca bu işlem, yeni oluşturduğumuz projenin içinde bir dizi dosya oluşturur; gerekirse Django dokümantasyonunda bunları daha detaylı inceleyebilirsiniz.
- 'cd' komutunu kullanarak yeni oluşturulan proje dizinine geçin ve 'ls' komutuyla oluşturulan dosyaları görüntüleyin.

- Projenizi 'python manage.py runserver' komutuyla çalıştırabilirsiniz.

- Projeyi favori tarayıcınızda (Google Chrome, Mozilla Firefox vb.) görüntüleyebilirsiniz. Tarayıcınıza gelip URL çubuğuna 'localhost:8000' veya '127.0.0.1:8000' yazın.

Not: Yukarıdaki sayfayı görebilmek için bash üzerinde sunucunun arka planda çalışıyor olması gerekir. Ayrıca, gerekirse Windows/Linux’ta 'Ctr+C' ve Mac’te 'Cmd+C' ile sunucuyu manuel olarak durdurabilirsiniz.
Yeni Django Projesine Başlama
Django’da yeni bir proje oluşturmak her zaman aşağıda gösterildiği gibi iki adımdan oluşur.
- İlk adım, 'python manage.py startapp
app_name' komutunu kullanarak bir uygulama oluşturmaktır; sizin durumunuzda app_name 'blog' olacaktır. Django’da tek bir projede birden fazla uygulama bulunabilir ve her uygulama projeye tekil ve belirli bir işlev kazandırır.
- İkinci adımda, 'django_blog/settings.py' dosyasındaki INSTALLED_APP bölümünde değişiklik yaparak projemize yeni oluşturulan uygulamamızı tanıtırız.

Modellerimizde Değişiklik Yapma
Django, varsayılan veritabanı olarak 'SQLite' kullanır; bu hafif bir veritabanıdır ve küçük projelerde kullanılır; bu proje için uygundur. Veritabanıyla çalışmayı oldukça kolaylaştıran 'Object Relational Mapper (ORM)' kullanır. Doğrudan veritabanı kodu yazılmaz; veritabanı tabloları 'models.py' içinde 'class' anahtar sözcüğü yardımıyla oluşturulur.
'blog/models.py' içinde 'Post' adlı yeni bir model oluşturmanız gerekir. Bu sınıf, daha sonra bir veritabanı tablosuna dönüşecek ve şu anda 'models.Model'den kalıtım alacaktır. Standart bir blogda olduğu gibi, belirli bir 'Post' bir başlık içerir; bu alan CharField olacaktır. Bu, metin tabanlı bir sütundur ve zorunlu 'max_length' argümanını kabul eder; sizin durumunuzda bu değer 50’dir. Ayrıca 'content' adlı bir başka alan daha vardır; bu, standart bir blogda 'Post'un ayrıntı metnini içeren TextField’tır. Çift alt çizgili ('str') yöntem tanımlanmıştır; bu, 'title' alanını geçersiz kılar ve bazı nesneler yerine başlığın gerçek adını döndürür. 
Migration Oluşturma
'python manage.py makemigrations', 'models.py' oluşturulduktan sonra onu okuyan ilk adımdır. 'migrations' adlı yeni bir klasör oluşturur ve içinde veritabanları arasında taşınabilir '0001_initial.py' adlı bir dosya yer alır. 
Veritabanına Migration Uygulama
Bu ikinci adımda 'python manage.py migrate' komutu yeni oluşturulan 'migrations' klasörünü okur, veritabanını oluşturur ve modelde bir değişiklik olduğunda veritabanını geliştirir. 
Yönetime Kayıt
'blog/admin.py' dosyasına geçelim ve 'from .models import Post' ile 'Post' adlı modeli içe aktaralım. Modelleri yönetime kaydetmek için komut 'admin.site.register(Post)' şeklindedir.

Süper Kullanıcı Oluşturma ve Yönetim Panelinde Görüntüleme
'admin' paneline erişmeden önce bir Süper Kullanıcı oluşturmanız gerekir. Bunun için 'winpty python manage.py createsuperuser' komutunu kullanın. 
Not: winpty, Windows Konsol Programlarıyla iletişim kurmak için bash’e özgü bir komuttur.
Sunucunuzu bash üzerinde arka planda python manage.py runserver komutuyla çalıştırın. Tarayıcıya gidip URL çubuğuna aşağıdakileri yazın. 
Ardından daha önce oluşturduğunuz kullanıcı adı ve şifre bilgilerini girin: 
Ardından yönetim panelinizi, yeni oluşturduğumuz 'Post' modeliyle birlikte görüntüleyin. 
'Ekle' düğmesine tıklayarak 'Post' içeriğini değiştirin. Bilgileri doldurup ayrıntıları 'Kaydet' ile kaydedin. 
Görünümler ve URL’lerde Değişiklik
'blog/views.py' dosyasına gidin ve aşağıda gösterildiği gibi değişiklikleri yapın. İsteği alan 'blog_list' fonksiyonunu ekleyin. 'Post.objects.all()' kullanılarak oluşturulan tüm nesneleri alan bir sorgu yapılır ve post değişkenine kaydedilir. 'context' adlı yeni bir sözlük oluşturulur; burada nesne bir anahtar olarak aktarılır ve şablonda 'blog-list.html' üzerinden alınır; bu da render yardımıyla yanıt döndürülerek gerçekleştirilir. 
'django_blog/blog' içinde 'urls.py' adlı yeni bir dosya oluşturun ve aşağıdaki değişiklikleri ekleyin. 'blog_list' görünümüne göreli bir içe aktarma vardır; ayrıca bir 'urlpatterns' bulunur; bu, web sitesinde belirli bir sayfaya giden yolların listesidir. Şu anda b’path boş bir dize ve görünümün adını içerir. 
'django_blog/urls.py' dosyasına geçip include’u içe aktaralım ve 'urlpatterns' üzerinde değişiklik yapalım. Ardından uygulamanızın URL’lerine include ile yolu ekleyin. Ayrıca, kullanıcılar 'posts/' üzerinden yönlendirildiğinde 'blog.urls'’e gider.
Şablonları Oluşturma ve Değiştirme
Genellikle 'HTML' dosyalarını barındıran ve kendi şablonlama diline sahip olan 'Jinja2' ile çalışan bir templates klasörü oluşturalım. Klasörün adı, gelenek gereği 'templates/blog/blog_list.html' olmalıdır. 
Aşağıda 'HyperTextMarkup Language(HTML) ile ilgili sözdizimini görebilirsiniz; 'h1' büyük başlık için ve sırasız liste (ul) ile liste öğesi li kullanılmıştır. Ayrıca, 'Jinja 2' ile ilgili 'for' döngüsü sözdizimi kullanılmıştır; burada 'blog_list' adlı nesne 'blog/views.py'’den bir anahtar olarak geçirilmiş ve 'list' adı verilen her öğe üzerinde yinelenmiştir. 
Web sayfasında 'İlk Gönderi' başlıklı 'title'ı görüntüleyin. 
Yönetim panelinden yukarıdakiyle aynı şekilde bir bilgi daha ekleyelim ve ikinci gönderinizin title’ını 'İkinci Gönderi' olarak adlandırın. 
Bilgileri ekledikten ve ana sayfayı yeniledikten sonra bilgiler güncellenecektir. 
Her Bir Gönderi İçin Ayrıntılar
Her bir gönderi başlığı ve içeriğiyle ilgili bilgilerin bulunduğu ayrı sayfalar oluşturacaksınız. 'url' "localhost:8000/posts/'id'" şeklinde olacaktır; burada id, Django tarafından her 'Post'a verilen benzersiz numarayı ya da birincil anahtarı ifade eder.
'blog/view.py' içinde 'blog_detail' adında ve parametre olarak id kabul eden bir fonksiyon oluşturalım. Ayrıca yalnızca belirli id’yi almak için bir sorgu yapılır ve 'each_post' içine kaydedilir. Yukarıdakine benzer şekilde ihtiyaç duyulan bilgi 'blog_detail.html'’e context olarak aktarılır. 
'blog/urls.py' içindeki url, yolun '<id>' içerdiği ve benzersiz id’yi tamsayı biçiminde kabul ettiği şekilde değiştirilir. Varsayalım ki kullanıcı yalnızca 'posts/' adresine gelirse tüm gönderileri görür; ancak 'posts/1' adresine geldiğinde yalnızca ilk oluşturulan gönderiye ait bilgileri görür. 
'blog/blog_detail.html' adlı yeni bir dosya oluşturalım ve aşağıdaki değişiklikleri yapalım. blog_detail context olarak geçirildiğinden, 'title' ve 'content' nokta gösterimiyle erişilebilir. 
Tarayıcınızın URL’ine gidip aynı şekilde yazarak tekil gönderileri görüntüleyin. İlk oluşturulan bilginin 'id'si '1', ikincisinin '2' ve yeni oluşturulanlar için bu şekilde artar. 
Gönderiyi Silme
İsteği ve id’yi alan blog_delete fonksiyonunu tanımlayalım. Ayrıca, 'Post.objects.get(id=id)' ile benzersiz id’ye sahip nesneyi alan ve each_post değişkenine kaydeden bir sorgu yapılır. Ardından 'Post'u silmek için 'each_post.delete()' çağrılır. Son olarak, 'django.http' modülünden HttpResponseRedirect içe aktarılır ve sayfayı '/posts/' adresine yönlendirmek için kullanılır. 
. 'urls.py' içinde 'blog_delete' içe aktarılır ve yol, sonunda delete bulunan id’nin ilgili nesneyi ya da bilgiyi kaldıracağı şekilde '<id>/delete' olarak ayarlanır. 
Gönderimizi, 'urls.py' içinde aşağıdakini yazarak silelim. 
Son olarak, ana sayfada yalnızca bir gönderi varken 'posts/1/delete/' çağrıldığında sayfa '/posts' adresine yönlendirilir. 
Sonuç
Tebrikler, eğitimi tamamladınız! Django Web Geliştirme’nin temellerini ve CRUD işlevselliğini öğrendiniz. Ayrıca, belirli bir konu hakkında daha fazla ayrıntı için Django Dokümantasyonuna göz atın.
Kaynaklar:
Python ile Django Web Geliştirme SSS
Django nedir?
Django, model-template-view mimari desenini takip eden, Python ile yazılmış ücretsiz ve açık kaynaklı bir web çatısıdır. Geliştiricilerin uygulamaları mümkün olan en hızlı şekilde fikirden canlıya taşımalarına yardımcı olacak şekilde tasarlanmıştır.
Django’nun bazı özellikleri nelerdir?
Django’nun bazı özellikleri arasında hafif ve modüler bir tasarım, veritabanı etkileşimlerini basitleştiren güçlü bir ORM (Object-Relational Mapper) ve kullanıcı kimlik doğrulama ve yönetimi, form işleme ve içerik yönetimi gibi yaygın web geliştirme görevleri için yerleşik destek bulunur.
Django’ya nasıl başlarım?
Django ile başlamanız için makinenize Python ve Django kütüphanesini kurmanız gerekir. Ardından django-admin startproject komutunu kullanarak yeni bir Django projesi oluşturabilir ve Django’nun yerleşik özellikleri ve araçlarını kullanarak uygulamanızı geliştirmeye başlayabilirsiniz.
Django’da nasıl veritabanı oluştururum?
Django varsayılan olarak, Python ile birlikte gelen SQLite veritabanı motorunu kullanır. Django uygulamanızda modeller tanımlayıp migrate komutunu çalıştırarak yeni bir veritabanı oluşturabilirsiniz. Bu işlem, modellerinizin verilerini saklamak için gerekli tabloları veritabanında oluşturur.
Django’da görünüm ve şablonları nasıl oluştururum?
Django’da görünümler, HTTP isteklerini işleyen ve HTTP yanıtları döndüren fonksiyonlardır. Uygulamanızda, bir istek alan ve bir yanıt döndüren fonksiyonlar tanımlayarak görünümler oluşturabilirsiniz. Şablonlar, dinamik içerik için yer tutucular içeren HTML dosyalarıdır. Dinamik içeriği şablonlara yerleştirmek ve görünümlerinizde render etmek için Django’nun şablon dilini kullanabilirsiniz.
Bir Django uygulamasını nasıl dağıtırım?
Barındırma ihtiyaçlarınıza ve tercihlerinize bağlı olarak bir Django uygulamasını dağıtmanın çeşitli yolları vardır. Yaygın seçenekler arasında Heroku veya AWS gibi bir bulut platformuna dağıtım, Apache veya Nginx gibi bir web sunucusunun kullanılması ya da PythonAnywhere veya DigitalOcean gibi bir barındırma hizmetinden yararlanmak bulunur.
