Django'yu bilen bilir, iyidir hoştur da her 'taze' teknoloji gibi Türkçe doküman sıkıntısı vardır. Eh bende çorba tuzum olsun diyerek
Django Tutorial'ı çevirmeye koyuldum. Yanlız şunu belirtmeliyim ki ciddi olarak programlama ile uğraşmak isteyenlerin zahmet edip İngilizce öğrenmesi gerektiğini düşünüyorum. Fakat bu kesinlikle ben biliyorum, bilmeyenlerden üstünüm iması değil. Demek istediğim nasıl ki bir tarihçi Osmanlıca bilmeden, yazıtları okuyamadan ben Osmanlı tarihçisiyim diyince biraz garip oluyorsa; burada da durum aynı bence. Neyse geçelim Django'ya. Burada python, django ve veritabanınızı kurduğunuzu varsayıyorum. henüz kurmadıysanız
buyrun. Ayrıca linux kullandığınızı varsayıyorum.
Proje yaratma:İlk yapacağımız bir django projesi için gerekli temel ayarları yapmak ve temel proje kodunu otomatik oluşturmak bunun için projeyi saklayacağımız dizine geçip:
django-admin.py startproject myproject
diyoruz ve
mysite dizini altında ilk django projemiz oluşturulmuş oluyor. Bakalım ne yapmış sitem dizini içerisinde
mysite/
__init__.py
manage.py
settings.py
urls.py
Bunlar ne iş yapar diyorsanız:
- __init__.py: Python'a bu dizinin bir python paketi olduğunu söyleyen boş bir dosya. (Daha fazla bilgi için resmi python dokümantasyonunda paketler kısmına bakabilirsiniz. )
- manage.py: Django projenizle ilgili birçok işi yapmak için kullanacağımız komut-satırı aracı. Buna daha sonra geleceğiz. Detay için django-admin.py and manage.py.
- settings.py: Bu Django projesi için gerekli ayarları yaptığımız dosya. Daha fazla bilgi için dokümantasyonda Django settings'e bakılabilir.
- urls.py: Bu Django projesi için URL bildirimleri. Hangi URL ne iş yapacak hangi sayfaya gidecek şeklinde düşüneblirsiniz. Orjinal dokümantasyon için: URL dispatcher.
Geliştirme Server'ıBuraya kadar sorun var mı görmek için
mysite dizini içerisinde
python manage.py runserver
komutu ile geliştirme serverını başlatabilirsiniz.
Validating models...
0 errors found.
Django version 1.0, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Çıktısını gördüyseniz bir sorun yok demektir. Tarayıcınızda http://127.0.0.1:8000/ 'e giderseniz, bir hoşgeldin yazısını görebilirsiniz.
Portu değiştirmek için
python manage.py runserver 8080
ile çalıştırabilirsiniz. Eğer yerel ağınızdaki bilgisayarların erişebilmesini isterseniz
python manage.py 0.0.0.0:8000
ile başlatabilirsiniz. Fakat unutmayın bu server sadece geliştirme amaçlı. Sitenizi gerçek kullanıma açmak için 'gerçek' bir server kullanmalısınız. Bu konuya daha sonra geliriz.
Veritabanı ayarlarısettings.py açın ve aşağıdaki ayarları ihtiyacınıza göre değiştirin. Bir çok veritabanı kullanabilmemize rağmen basitlik açısından önce sqlite kullanmanızı öneririm.
DATABASE_ENGINE -- 'postgresql_psycopg2', 'mysql' veya 'sqlite3'. Diğer seçenekler de mevcut.
DATABASE_NAME -- Veritabanı ismi. SQLite için bilgisayarınızda tutulacak dosyanın ismi. Dosyanın tam yolu olmalı. Aynı dizinde olması için 'dev.db' gibi bir isim yeterli.
DATABASE_USER -- Veritabanı kullanıcı ismi (SQLite için kullanılmıyor).
DATABASE_PASSWORD -- Veritabanı şifre (SQLite için kullanılmıyor).
DATABASE_HOST -- Veritabanınızın tutulduğu bilgisayar. Aynı fiziksel host için boş bırakın (SQLite için kullanılmıyor).
Hala
settings.py'de iken INSTALLED_APPS kısmına bir göz atın buraya kullanacağımız uygulamaları ekleyeceğiz. İlk gelenler sıklıkla(hemen herzaman) kullanılanlar. O yüzden değişiklik yapmanıza şimdilik gerek yok.
Veritabanı ayarlarını yaptığımıza göre kullanacağımız uygulamaların ihtiyacı olan veritabanı tablolarını oluşturabiliriz.
python manage.py syncdb
Her uygulama için oluşturulan tabloları listeleyecek ve bir superuser hesabı oluşturmanızı isteyecek. Bu aşamada oluşturun çünkü admin menüsü kısmına geldiğimizde lazım olacak.
Model OluşturmakArtık 'proje'nin ayarları tamam olduğuna göre işimiz bakabiliriz. Sıradaki işimiz bir uygulama oluşturmak olacak. Uygulamaların asıl amacı PYTHONPATH'iniz içinde bir package oluşturmak ve aynı kodu başka bir projede tekrar kullanabilmenizi sağlamaktır. Fakat şimdilik bir oy verme uygulaması yapacağız ve yazdığımız kod projeye bağımlı olacak. Tamamen tekrar kullanılabilir bir uygulama yazmak bu yazının kapsamı dışında. Bu uygulamaya (orjinal dökümanla tutarlı olması açısında)
polls ismini vereceğim. İsterseniz siz başka birşey kullanabilirsiniz.
python manage.py startapp polls
Oluşturulacak
polls dizini:
polls/
__init__.py
models.py
views.py
Uygulamamız hazır modellerimize geçebiliriz. Modeller uygulamamızın vertabanı kısmında tutacağımız verileri tutacağımız sınıflar olacak. Yani yapmaya başladığımız ilk iş olmasının iyi bir sebebi var. Geri kalan tüm işlevsellik bir şekilde bunlarla ilişkili olacak.
polls/models.py dosyasını aşağıdaki kodla değiştirin.
from django.db import models
class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice = models.CharField(max_length=200)
votes = models.IntegerField()
Yukarıdaki kod dikkatle incelediğinde rahatlıkla anlaşılabilir. Her model django.db.models.Model sınıfından türetilen bir sınıfla temsil edilir. Bir model sınıfının sahip olduğu her üye değişken bir veritabanı alanını(veritabanı tablosunda sütünu) temsil eder.
Veritabanı alanlarını tanımlamak için de Field sınıfından türetilmiş nesneleri kullanıyoruz. Örneğin bir karakter alanı için CharField ve tarihler için DateTimeField türünden nesneler kullanarak her alanın veri tipini belirliyoruz.
Alan değişkenlerine verilen isimler (yani question veya pub_date gibi) normal python değişkenleri gibi isimlendirilir ve kodumuz içerisinde veritabanının sütünlarını belirtmek için kullanılır.
Her Field opsiyonel olarak alanın tanımını içeren bir string alır. Alanları verilen bu tanım kodun anlaşılmasına yardım etmesinin dışında Django tarafından oluşturulan admin menüsünde de kullanılır. Bu isim belirtilmediği takdirde Django değişken ismini kullanacaktır.Bu örnekte sadece Poll.pub_date alanı için tanım belirttik, diğer alanlar için değişken ismi yeterli görülmüştür.
Bazı Field sınıfları için tanımlanması zorunlu özellikler vardır. Örneğin CharField, max_length ile maksimum uzunluğun belirtilmesini gerektirir. Bu değer sadece veritabanı şemasında değil ileride göreceğimiz gibi validasyonda da kullanılacaktır.
Son olarak tablolar arası ilişki için ForeignKey kulanıldığını söyleyelim. Yukarıdaki örnekte her bir Choice nesnesinin tek bir Poll nesnesine ait olduğu anlamına gelir. Django tüm yaygın veritabanı ilişkilerini destekler: çoktan bire, çoktan çoğa ve birden bire.
Modelleri Kullanmak
Bu küçük model kodumuz django'nun bize yardım etmesi için birçok bilgi içeriyor. Bu kod sayesinde django:
Bu uygulama için veritabanı şemamızı yaratabilir. (istediğimiz veritabanı yönetim sistemi için CREATE TABLE ifadelerini üretebilir).
Poll and Choice nesneleri için python içerisinden veri tabanına erişmemizi sağlayacak API'yı üretebilir.
Fakat ilk önce projemize uygulamamızı kullanmasını söylemeliyiz. ( Django uygulamaları "pluggable-takılabilir?" dir yani : Bir uygulamayı birden fazla projede kullanabilirsiniz, ve uygulamaları başkalarının kullanabilmesi için yayınlayabilirsiniz çünkü uygulamalar belirli bir django projesine veya kurulumuna bağlı değildir.)
settings.py dosyasını tekrar açın ve INSTALLED_APPS çoklusunun 'mysite.polls' değerini de içermesini sağlayın ki aşağıdaki gibi olsun:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'mysite.polls'
)
Artık django mysite projesinin polls uygulamasını da içerdiğini biliyor. Başka bir django komutu yürütelim:
python manage.py sql polls
Aşağıdaki gibi bir çıktı almalısınız (polls uygulaması için CREATE TABLE SQL deyimleri):
BEGIN;
CREATE TABLE "polls_poll" (
"id" serial NOT NULL PRIMARY KEY,
"question" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
"choice" varchar(200) NOT NULL,
"votes" integer NOT NULL
);
COMMIT;
Bu sql deyimlerinin yürütülmesi için:
python manage.py syncdb
komutunu tekrar çalıştırmalısınız. syncdb komutu settings.py'daki INSTALLED_APPS içinde belirtilen tüm uygulamalar için henüz yaratılmamış tabloları yaratır. Bu komutun tekrar çalıştırılması veri kaybına neden olmaz sadece yeni tablo yaratmak için kullanılır.
Api'ile oynamakGerçekten uygulama geliştirmeye başlamadan önce interaktif python kabuğunda Django veritabanı API'si ile oynamak eğitici olacaktır. Kabuğu başlatmak için:
python manage.py shell
komutunu kullanıyoruz. Sadece python ile başlatabileceğimiz kabuğun yerine bu komutu kullanarak iki işlemi elle yapmaktan kurtuluyoruz. Birincisi mysite'ı sys.path üzerine eklemek. Bu django'da sıklıkla kullanılan mysite.polls.models şeklinde erişimi sağlıyor. INSTALLED_APPS uygulama listesinde uygulamaları bu şekilde belirttiğimizi hatırlayın. İkincisi, DJANGO_SETTINGS_MODULE ortam değişkeninin projemizin settings.py dosyasını göstermesinin sağlanmasıdır. Eğer bu işlemleri kendiniz yaparsanız pekala standart kabuğu kullanabilirsiniz. Fakat shell komutu ile bu işlemleri farklı uygulamalar için her seferinde yapma derdinden kurtulmuş oluyoruz.
Aşağıdaki komutları deneyerek öğrenmeye devam edebilirsiniz:
>>> from mysite.polls.models import Poll, Choice # Import the model classes we just wrote.
# No polls are in the system yet.
>>> Poll.objects.all()
[]
# Create a new Poll.
>>> import datetime
>>> p = Poll(question="What's up?", pub_date=datetime.datetime.now())
# Save the object into the database. You have to call save() explicitly.
>>> p.save()
# Now it has an ID. Note that this might say "1L" instead of "1", depending
# on which database you're using. That's no biggie; it just means your
# database backend prefers to return integers as Python long integer
# objects.
>>> p.id
1
# Access database columns via Python attributes.
>>> p.question
"What's up?"
>>> p.pub_date
datetime.datetime(2007, 7, 15, 12, 00, 53)
# Change values by changing the attributes, then calling save().
>>> p.pub_date = datetime.datetime(2007, 4, 1, 0, 0)
>>> p.save()
# objects.all() displays all the polls in the database.
>>> Poll.objects.all()