Anasayfa > Dökümanlar, Diğerleri > Django ile programlama dökümanı

Django ile programlama dökümanı

Neden Django ?

Django, Python diliyle yazılmış bir web framework’üdür. Ülkemizde henüz fazla popüler olmamasına rağmen, gün geçtikçe yaygınlaşmaktadır.

Django’nun belki de en güçlü yönü kısa sürede karmaşık web siteleri üretmemize imkan vermesidir. Django, programcıları web sitesi hazırlamanın sıkıcı ve zahmetli bölümlerinden kurtarmayı amaçlar. Django’nun özelliklerine şöyle bir göz atalım :

  • Python dili ile yazılmıştır. Python’da olduğu gibi,Django’da da kod yazmak hızlı ve eğlencelidir.
  • Öğrenilmesi ve kullanılması kolaydır.
  • Açık kaynak kodludur. Dolayısıyla Django’yu kullanırken herhangi bir ücret ödemek zorunda değilsiniz.
  • Django admin panelini sizin yerinize oluşturur. Yani diğer dillerde yaptığınız gibi vaktinizi admin paneli yazmakla harcamazsınız. Ayrıca admin panelini zevkinize göre değiştirmenize izin verir.
  • Url yönetimi kolaydır. Django sayesinde çok daha temiz ve seo dostu url’leri büyük kolaylıkla hazırlarsınız.
Django Kurulumu

Django’yu kurmadan önce sisteminizde Python’ın 3.0 dan önceki bir versiyonunun yüklü olması gerekir. Linux bilgisayarlarda Python muhtemelen kurulu gelecektir. Ancak yüklü değilse ya da farklı bir işletim sistemi kullanıyorsanız www.python.org/download/ adresinden kurulum dosyasını indirebilirsiniz.

Django’yu kurmak için ise www.djangoproject.com/download/ adresinden dosyayı indirin. Dosyanın içindekileri bir klasöre çıkardıktan sonra komut satırını açın, dosyayı çıkardığınız klasöre geçiş yapın ve ardından “python setup.py install” komutunu çalıştırın.

Örneğin, Ubuntu’da kurulum :

$ tar xzvf Django-1.3.tar.gz
$ cd /downloads/Django-1.3
$ python setup.py install

Windows’ta komut satırını yönetici olarak çalıştırmanız gerekebilir. Eğer yukarıdaki komutu çalıştırırken ‘python bulunamadı…’ şeklinde bir hata alırsanız , python.exe dosyasını Python yoluna eklemeniz gerekir.

Python’u sistem yoluna eklemek için : Bilgisayarım -> Sistem Özellikleri -> Gelişmiş Sistem Ayarları -> Yerel Değişkenler’e gidin. Açılan pencerede alt kısımdaki değişkenler arasında Path ismindeki değişkeni seçip , Değiştir’e tıklayın. Değişken değerinin sonuna ‘;’ ekleyin ve ardından Python’un yolunu yazın ( ‘;C:\Python27’ gibi )

Django’nun kurulduğunu kontrol etmek için Python shell’e geçip aşağıdaki kodu çalıştırın

import django

Eğer bir hata vermiyorsa Django kurulmuş demektir.

Kurulumla ilgili sorunlarınız için soru & cevap bölümümüzü ziyaret edebilirsiniz.

Kurulum tamamlandıktan sonra ilk Django projemize başlayabiliriz.

Hangi Django editörü ?

Django ile yazılım geliştirirken bir IDE kullanmak size birçok kolaylık sağlayabilir. Djangocular arasında popüler olan birkaç IDE’ye kısaca göz atalım :

PyDev

Eclipse için yazılan bir plugin. Django için kod renklendirme ve henüz 100% olmasa da kod tamamlama özelliklerini sağlıyor. Özellikle daha önceleri Eclipse kullanan yazılımcılar PyDev kullanmakta hiç zorluk çekmeyeceklerdir.

Ücretsiz olması ve hem linux hem de windows’ta çalışması diğer artıları arasında. Bazı kullanıcılar biraz ‘ağır’ bulabilirler.

Komodo Edit

Linux ve Windows’ta çalışıyor. PyDev gibi Komoda Edit de Django için kod renklendirme ve kod tamamlama (yine,100% değil) gibi özellikleri sağlıyor. Açık kaynak kodlu.

PyCharm

Kod renklendirme ve kod tamamlama konusunda belki de en iyi desteği sağlıyor. Linux ve Windows’ta çalışıyor. Ücretli olması en büyük dezavantajı diyebiliriz. Buna rağmen Django kullanıcıları arasında oldukça popüler.

Django’ya Giriş

Artık Django’nun sisteminizde kurulu olduğuna göre ilk örneğimize başlayalım.

İlk önce kodumuzu nerede tutacağımıza karar vermeliyiz. Ben kendi bilgisayarımda /home/ugur/djangom/ adresinde tutacağım.

Şimdi komut satırını açalım ve o dosyaya geçelim

$ cd djangom

Şimdi sıra ilk projemizi oluşturmaya geldi. Bu örnekte çok detaylı olmayan bir blog sitesi oluşturacağız. Projemizin ismine “blogum” diyelim. Şimdi komut satırına aşağıdaki kodu giriyoruz.

$ django-admin.py startproject blogum
Eğer bu kod çalışmıyorsa django-admin.py’nin Python yolunda olduğundan emin olun.

Böylece projemiz başlamış oldu. Şimdi cd yaptığımız klasörü kontrol edersek o klasörde dört adet yeni dosya göreceğiz. Şimdi bu dosyaları inceleyelim

init.py : Python kullananlar bilirler, bu dosya Django’ya o klasörün bir Python modülü olduğunu söylüyor.

manage.py : Bu dosyanın görevi projemizin çalışması için gerekli ortamı hazırlamak. Örneğin; projemizde kullanacağımız ayarları belirten dosyayı settings.py’e atamak gibi.

setting.py : Projemizle ilgili ayarları bu dosyada yapacağız.

urls.py : Url’leri düzenlediğimiz yer.

Bu dört dosyadan bizim işimize yarayanlar settings.py ve urls.py. Diğer iki dosyayla pek ilgilenmeyeceğiz.

Projemizi oluşturduğumuza göre çalıştırıp bir kontrol edelim. Bunun için komut satırına aşağıdaki kodu giriyoruz.

$ python manage.py runserver
Eğer komut satırında python bulunamadı şeklinde bir hata alıyorsanız python.exe’nin Python yolunda olduğundan emin olun. Ya da geçici bir çözüm olarak python.exe’nin tam yolunu yazabilirsiniz : “c:/python2.7/python.exe manage.py runserver” gibi.

Şimdi tarayıcınızda http://127.0.0.1:8000 adresine gidin. Eğer herşey yolunda “It Worked!” ile başlayan, Django’nun çalıştığını söyleyen bir mesaj göreceksiniz.

Django çalıştığına göre ilk projemize başlayalım.

settings.py dosyasını bir metin editöründe açalım. Aşağıda gördüğümüz kısma gelelim.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '',                      # Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Bu kısımda veritabanıyla ilgili bilgileri gireceğiz.

ENGINE kullanacağımız veritabanını gösteriyor. Bu örnekte kolaylık olması açısından sqlite kullanacağız. NAME veritabanımızın bulunduğu dosyanın yolu. Sadece sqlite için geçerli. User,password,host ve port’u tahmin edebilirsiniz. Yorumlarda da gördüğünüz gibi sqlite için bu kısımları doldurmaya gerek yok.

MySQL ya da PostgreSQL gibi bir veritabanı kullanmak isterseniz, kullanmak istediğiniz veritabanını önceden oluşturmanız gerekmekte.

Sonuç olarak benim değişikliklerim bunlar..Siz de NAME kısmını kendinize göre düzenleyin (gerekli dosyayı istediğiniz yere kaydedin)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '/home/ugur/djangom/veritabani.db',# Or path to database file if using sqlite3.
        'USER': '',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

Veritabanı ayarlarını yaptık. settings.py dosyasını kaydedelim,birazdan tekrar göz atacağız.

Eğer dosyayı biraz kurcaladıysanız içinde birçok ayarın olduğunu görmüşsünüzdür. Bunların hepsine yeri geldiğinde değineceğiz.

App nedir,Project nedir ?

Project projedir,app ise uygulamadır. Bir proje bir veya daha çok uygulamanın bir araya gelmesiyle oluşur.

Bizim de projemiz için uygulamalara ihtiyacımız olacak. Örneğin bu projede “gunluk” uygulaması oluşturacağız.

Uygulamalarımız proje klasörünün içinde yaşayacak,bu yüzden komut satırında proje klasörüne gidiyoruz. Ardından bu komutu yazıyoruz :

$ django-admin.py startapp gunluk

Bu komut bulunduğumuz klasörde “gunluk” isminde yeni bir klasör oluşturdu. “gunluk” klasörünü açtığımızda içinde dört dosya göreceksiniz.

init.py dosyası Django’ya bu klasörün bir Python modülü olduğunu söylüyor , test.py dosyası ise uygulamamızı test ederken kullanacağız. Şimdilik bu dosyalarla işimiz yok, Django kodunu test etmeyi ilerki derslerde göreceğiz.

Asıl önemli olanlar ise views.py ve models.py.

models.py dosyasında veritabanı için oluşturacağımız modelleri tutacak. views.py ise fonksiyonları tutacak. Bu dosyaları birazdan kullanmaya başladığımızda daha yakından inceleyeceğiz.

Artık projemiz ve bir adet uygulamamız hazır olduğuna göre sıra veritabanı modellerini oluşturmakta.

Modeller

Django ile model oluştururken SQL sorguları yazmanız gerekmiyor. Django’nun kendi syntaxını kullanarak oluşturuyoruz modellerimizi. Şimdi models.py dosyasını açın ve aşağıdaki kodu dosyaya kopyalayın.

from django.db import models

class Yazar(models.Model): isim = models.CharField(max_length=100) email = models.EmailField()

class Mesaj(models.Model): baslik = models.CharField(max_length=150) icerik = models.TextField() giris_tarihi = models.DateTimeField() yazar = models.ForeignKey(Yazar)

Yazdığımız kodu satır satır inceleyelim!

Öncelikle models’i dosyamıza ekliyoruz. Ardından iki tane model sınıfı oluşturuyoruz : Mesaj ve Yazar. Model isimlerinden sonra gelen “(models.Model)” yazdığımız sınıfın biraz önce dosyamıza eklediğimiz models dosyasının içinde bulunan Model sınıfının bir alt sınıfı olduğunu belirtiyor. Django’da oluşturacağımız tüm modeller Model sınıfının bir alt sınıfı olmalıdır.

Modelleri oluşturduktan sonra alanlarını ekliyoruz. Örneğin yazarların ismi için CharField işimizi görür. Tarih bilgileri için DateTimeField , email için ise EmailField() alanlarını kullanabiliriz.

Yukarıda gördüğümüz ForeignKey ise yazar ve gönderdiği mesaj arasında bire-çok (one-to-many) ilişkisi sağlıyor. Yani her mesajın ayrı bir yazara ait olduğunu Django’ya söylüyor.

Dikkatinizini çekmiştir, modellerimizde id alanı yok. Bundan sonra oluşturacağımız modellerde de bu alanı biz oluşturmayacağız, çünkü Django onu kendi halledecek.

Şimdi settings.py dosyasını tekrar açalım ve INSTALLED_APPS bölümüne bir göz atalım. Bu kısımda projemizde kullanacağımız uygulamaları ekleyeceğiz. Projemizi ilk oluşturduğumuzda Django otomatik olarak birkaç uygulamayı eklemişti. Şimdi onların altına kendi uygulamamızı ekleyelim. Artık INSTALLED_APPS bu şekilde görünecek

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blogum.gunluk',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)

Bundan sonra projemizde oluşturduğumuz her uygulamayı ( “projeadı.uygulamaadı” formatında) buraya ekleyeceğiz.

Şimdi komut satırına gidelim ve aşağıdaki kodu girelim

$ python manage.py sql gunluk

Bu kod bize models.py dosyasındaki modellerin sql çıktısını gösterir. Eğer bir hata ile karşılaşmadıysanız aşağıdakine benzer bir çıktı alacaksınız.

BEGIN;
CREATE TABLE "gunluk_yazar" (
    "id" integer NOT NULL PRIMARY KEY,
    "isim" varchar(100) NOT NULL,
    "email" varchar(100) NOT NULL
)
;
CREATE TABLE "gunluk_mesaj" (
    "id" integer NOT NULL PRIMARY KEY,
    "baslik" varchar(150) NOT NULL,
    "icerik" text NOT NULL,
    "giris_tarihi" datetime NOT NULL,
    "yazar_id" integer NOT NULL REFERENCES "gunluk_yazar" ("id")
)
;
COMMIT;

Gördüğünüz gibi Django id alanını kendiliğinden ekledi.

Bu kod bize sadece modellerimizin oluşturacağı sql kodunu gösteriyor, yani henüz veritabanımızı oluşturmadı. Veritabanını oluşturmak içinse aşağıdaki kodu yazın , bu kodu INSTALLED_APPS’a ekleme yazdığımızda ya da yeni bir model oluşturduğumuzda kullanmamız gerekecek.

python manage.py syncdb

Şöyle bir çıktı alacaksınız. Gördüğünüz gibi Django modellerimizi oluşturuyor.

Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table gunluk_yazar
Creating table gunluk_mesaj

You just installed Djangos auth system, which means you dont have any superusers defined.
Would you like to create one now? (yes/no):

Ve bize bir superuser oluşturmak isteyip istemediğimizi soruyor. “yes” yazarak kabul edin, kullanıcı adı,parola ve email bilgilerini doldurun.

Veritabanımızı oluşturduk,yönetici (superuser) bilgilerimizi de girdik. Daha ileri gitmeden önce komut satırını açıp veritabanına birkaç veri ekleyelim.

Django bize bir API sağlıyor. Bu API sayesinde sql kodu yazmadan verilerimize erişebiliyoruz. Şimdi komut satırına gidip aşağıdaki komutu çalıştıralım

$ python manage.py shell

Bu komutla Python’a geçtik.

Aşağıdaki kodu yazarak Mesaj ve Yazar modellerini import ediyoruz.

>>> from gunluk.models import Yazar,Mesaj
# Tüm yazarları göster
>>> Yazar.objects.all()
[]
# boş liste,çünkü henüz yazar eklemedik
# yeni yazar tanımla
>>> y = Yazar(isim="Ali",email="ali@gmail.com")
# yazarı kaydet
>>> y.save()
# kaydedildi , çeşitli değerleri kontrol edelim
>>> y.id
1
# pk (primary key) , id ile aynı anlama geliyor
>>> y.pk
1
>>> y.isim
'Ali'
# tekrar yazarların listesini alalım
>>> Yazar.objects.all()
# bir Yazar nesnesi döndürdü
[<Yazar: Yazar object>]

Yazarların listesini aldığımızda olarak bir yazar nesnesi aldık. bize bu nesnenin bir Yazar nesnesi olduğunu söylüyor, ancak onun dışında pek bir anlam ifade etmiyor. Bunu daha okunur kılmak için models.py dosyamıza gidip Yazar modeline yeni bir fonksiyon ekliyoruz.

from django.db import models

class Yazar(models.Model): isim = models.CharField(max_length=100) email = models.CharField(max_length=100) def unicode(self): return self.isim

class Mesaj(models.Model): baslik = models.CharField(max_length=150) icerik = models.TextField() giris_tarihi = models.DateTimeField() yazar = models.ForeignKey(Yazar) def unicode(self): return self.baslik

Bu fonksiyon sayesinde bundan sonra modellerimizin herhangi bir nesnesine ulaşmak istediğimizde daha okunur bir cevap alacağız.

Admin paneline geçmeden önce API’yi biraz daha kurcalayalım.

$ python manage.py shell

Python’a giriş yaptık, modellerimizi tekrar import edelim.

>>> from gunluk.models import Yazar,Mesaj
>>> y = Yazar(isim="Ahmet",email="ahmet@gmail.com")
>>> y.save()
>>> y
<Yazar : Ahmet>
>>> m = Mesaj(yazar=y,baslik="Merhaba",giris_tarihi="2011-10-11 10:23",icerik="Nasılsın ?")
>>> m.save()
>>> m.id
1
>>> m
<Mesaj: Merhaba>
>>> y2 = Yazar.objects.get(pk=1)
<Yazar : Ali>
>>> Mesaj.objects.filter(baslik__startswith='M')
[<Mesaj : Merhaba>]

API hakkında daha fazla bilgi için resmi dökümantasyon‘a göz atabilirsiniz.

Admin Paneli

Modellerinizi oluşturup, komut satırında API ile biraz uğraştıysanız, artık admin panelini oluşturma zamanı geldi.

Django admin panelinin büyük bir kısmını kendiliğinden üretecektir, bizim yapmamız gereken ise sadece paneli aktif hale getirmek.

Admin panelini aktifleştirmek için settings.py dosyasını açıp , INSTALLED_APPS kısmına geliyoruz. Ardından django.contrib.admin önündeki # işaretini kaldırıyoruz. Böylece admin panelini projemizde kullanacağımız uygulamalar arasına eklemiş olduk.

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blogum.gunluk',
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)

Sırada panele erişmek için ihtiyacımız olan adresi hazırlamak var. urls.py dosyasının içeriğini aşağıdaki şekilde değiştiriyoruz.

from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns(”, url(r’^admin/’, include(admin.site.urls)), )

Gördüğünüz gibi tek yaptığımız birkaç kod parçasının önündeki # işaretini kaldırmak oldu. # işareti Python’da tek satırlık yorumlar için kullanılır, bu işareti kaldırarak o yorumları koda dönüştürüyoruz.

urls.py ve settings.py dosyalarını kaydettikten sonra komut satırına dönüyor ve aşağıdaki kodu çalıştıyoruz.

$ python manage.py syncdb

Aşağıdakine benzer bir çıktı alacaksınız

Creating tables ...
Creating table django_admin_log
Installing custom SQL ...
Installing indexes ...
No fixtures found.

Django admin paneli için gerekli olan veritabanı tablolarını oluşturdu.

Server’ı çalıştıralım, aşağıdaki kodu komut satırına girin.

$ python manage.py runserver

:::bash
Validating models...

0 errors found Django version 1.3, using settings ‘blogum.settings’ Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C.

Eğer herşey yolunda gittiyse yukarıdaki gibi bir cevap gelecek,şimdi tarayıcınızda

http://127.0.0.1:8000/admin/

adresine gidin. bir karşılama ekranı göreceksiniz , superuser oluştururken kullandığınız parola ve kullanıcı ismini kullanarak giriş yapın. Artık admin panelini görüyor olmalısınız.

Bir sorunla karşılaştıysanız soru & cevap bölümümüzü ziyaret edebilirsiniz.

Admin panelini oluşturduk. Şimdi modellerimizi panele ekleyelim

“gunluk” uygulamanızın olduğu klasöre gidin ve orada admin.py isminde bir dosya oluşturun.

Dosyayı açın ve aşağıdakileri dosyaya girin

from django.contrib import admin
from gunluk.models import Mesaj,Yazar

admin.site.register(Mesaj) admin.site.register(Yazar)

İlk satırda admin dosyasını çağırıyoruz , ardından Mesaj ve Yazar modellerini ekliyoruz

Sonrasında ise register fonksiyonunu kullanarak modellerimizi admin paneline ekliyoruz.

Tarayıcınızda admin paneline dönüp sayfayı yenileyin. Modellerinizi , isimlerinin sonuna ‘s’ eklenmiş olarak ,orada görüyor olmalısınız

Artık admin panelinden mesaj veya yazar ekleyip düzenleyebilirsiniz. Django gerekli sayfaları sizin için hazırladı.

“python manage.py runserver” komutu ile yeniden başlatmanız gerekebilir

Model isimlerinin mesajs ve yazars kısmını bir düzeltelim. models.py dosyasını açalım ve aşağıdaki giib düzenleyelim.

from django.db import models

class Yazar(models.Model): isim = models.CharField(max_length=100) email = models.CharField(max_length=100) def unicode(self): return self.isim class Meta: verbose_name_plural = “Yazarlar”

class Mesaj(models.Model): baslik = models.CharField(max_length=150) icerik = models.TextField() giris_tarihi = models.DateTimeField() yazar = models.ForeignKey(Yazar) def unicode(self): return self.isim class Meta: verbose_name_plural = “Mesajlar”

Modellerimize metadata ekledik. Metadatalar field dışındaki herşeydir. Meta özelliğini kullanarak verilerimizin sıralamasını, tablo ismi gibi özellikleri ayarlayabiliriz. Metadata için tam liste : Meta Options.

Şimdi tarayınızda admin paneli sayfasını yenileyin. İsimler düzenleşmiş olduğunu göreceksiniz.

Admin panelimiz çalışıyor,ancak onu kendimize göre biraz düzenleyelim

admin.py dosyasını açalım ve aşağıdaki gibi değiştirelim.

from django.contrib import admin
from test2.models import Mesaj,Yazar

class MesajAdmin(admin.ModelAdmin): ordering = [‘-giris_tarihi’] list_display = (‘baslik’,’giris_tarihi’,’yazar’) list_filter = (‘giris_tarihi’,’yazar’) search_fields = [‘baslik’]

class YazarAdmin(admin.ModelAdmin): ordering = [‘isim’] search_fields = [‘isim’]

# mesaj sayısını döndürür def mesajlar(self): m = Mesaj.objects.filter(yazar=self) return len(m) mesajlar.short_description = ‘Mesajlar’

list_display = (‘isim’,’email’,mesajlar)

admin.site.register(Mesaj,MesajAdmin) admin.site.register(Yazar,YazarAdmin)

Değişiklikleri kaydedip admin panelini açın. Yazarlar ve Mesajlar’a tıklayın. Paneldeki değişiklikleri farketmiş olmalısınız. Şimdi kodu açıklayalım.

MesajAdmin ve YazarAdmin isminde iki sınıf oluşturuyoruz. Bu sınıflar ModelAdmin’in alt sınıfı olacak.

Sınıfı oluşturduktan ordering,list_display gibi alanlar ekliyoruz.

  • ordering alanı verilerimizin sıralamasını etkiliyor. MesajAdmin sınıfında mesajları güncelliğe göre sıralarken,YazarAdmin sınıfında yazarlarımızı isimlerine göre (alfabetik olarak) sıralıyoruz.
  • list_display alanı verilerimizin listelendiği sayfada verilerin hangi özelliklerini görmek istediğimizi ayarlamamızı sağlıyor
  • list_filter alanı da verilerimizin listelendiği sayfada belirlediğimiz kriterlere göre verileri filtrelememizi sağlıyor.
  • search_fields alanı sayfamızın üst tarafına bir arama kutucuğu ekliyor.

Bunların dışında sınfımızın içinde bir de fonksiyon tanımladık. Bu fonksiyon yazarların kaç mesaj attığını bilmemizi sağlıyor. Daha sonra bu fonksiyonu list_display alanına ekleyerek, yazar verilerinin listelendiği sayfada her yazarın kaç mesaj attığını görmüş oluyoruz

Artık admin panelimiz oldukça işlevsel bir durumda. Bu konuda daha detaylı bilgi için Django’nun resmi dökümentasyonunu kontrol edebilirsiniz.

View ve Şablonlar

Veritabanı modellerimiz hazır , admin panelimiz de hazır. Sırada veritabanından veri çekme var.

Django’da veri çekme işleminin büyük bir bölümünü views.py dosyasında tanımladığımız fonksiyonlar ( view’ler ) sayesinde yapıyoruz. views.py dosyasını açarak ilk fonksiyonumuzu yazalım.

Öncelikle ne yapmamız gerektiğine karar verelim. Şu an sitemizde kullanıcıların ziyaret edebileceği bir bölüm yok. Bu sorunu çözmek için anasayfamızı oluşturalım, ve kullanıcılara bir “Hoşgeldiniz” mesajı gösterelim.

views.py dosyasını açıp aşağıdaki kodu girin

from django.http import HttpResponse

def anasayfa(request): return HttpResponse(“Selam!”)

İlk view’imizi yazdık. Peki bu fonksiyon ne yapıyor ? İlk satıra dikkat ederseniz HttpResponse adında bir nesneyi dosyamıza ekliyoruz. Yazacağımız tüm view’ler ya HttpResponse nesnesi döndürmek ya da bir istisna ile sona ermek zorundadır.

Bu fonksiyonun yaptığı şey ekrana “Selam!” yazdırmak. request ise tüm view’lerde ortak olan bir parametre.

View’i biraz geliştirelim. Django’nun veriler için sağladığı API’yi kullanarak veritabanındaki son 5 mesajı çekelim.

views.py’ yi açıp aşağıdaki şekilde değiştirin.

from django.http import HttpResponse
from gunluk.models import Mesaj

def anasayfa(request): son_mesajlar = Mesaj.objects.all().order_by(‘-giris_tarihi’)[:5] sonuc = ‘-‘.join([mesaj for mesaj in son_mesajlar]) return HttpResponse(sonuc)

Artık view’imiz veritabanından son 5 mesajı çekip, sonuç olarak bu mesajları döndürüyor. Ancak sonucun sunumu view’de gerçekleşiyor. Bunu şablona bırakmak istiyoruz. O yüzden aşağıdaki değişikliği yapalım.

from django.template import Context, loader
from django.http import HttpResponse
from gunluk.models import Mesaj

def anasayfa(request): son_mesajlar = Mesaj.objects.all().order_by(‘-giris_tarihi’)[:5] t = loader.get_template(‘anasayfa.html’) c = Context({ ‘mesajlar’ : son_mesajlar , }) return HttpResponse(t.render(c))

Context ve loader’ı dosyamıza ekledik. View anasayfa.html şablonuna son 5 mesajı gönderiyor.

View’imizin yeni hali “anasayfa.html” şablonunu yükleyip , ona bir bağlam ( Context ) gönderiyor. Bu bağlam şablonumuzda kullanacağımız değişkenlere view içinde hazırladığımız sonuçları bağlayan bir Python sözlüğüdür.

Örneğin; bu view fonksiyonumuzda son 5 mesajı ‘son_mesajlar’ değişkenine atadık. Context içinde ise bu değişkeni ‘mesajlar’ değişkenine bağladık. Bu durumda şablonumuzda bu 5 mesaja erişmek için ‘mesajlar’ değişkenini kullanacağız.

Şimdi anasayfa.html şablonunu oluşturalım.

Öncelikle Django’ya şablonları nerede tutacağımızı söylememiz gerekiyor. settings.py dosyasını açıp TEMPLATE_DIRS kısmına gidin ve şablonlarınızın yer almasını istediğiniz klasörün yolunu ekleyin. Benim settings.py’mde aşağıdaki şekilde görünüyor.

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    "/home/ugur/djangom/templates/"
)

Buraya yolunu eklediğiniz klasöre gidin ve ansayfa.html isminde bir dosya oluşturun.

Dosyayı aşağıdaki şekilde düzenleyin

<html>
<head>
<title>Blog'uma hoşgeldiniz!</title>
</head>
<body>
{% if mesajlar %}
    {% for mesaj in mesajlar %}
         {{ mesaj.baslik }} <br />
    {% endfor %}
{% else %}
mesaj yazacak vaktim olmadı! o yüzden hiç mesaj yok!
{% endif %}
</body>
</html>

anasayfa.html’yi oluşturmuş olduk.

Gördüğünüz gibi Django şablonlarında if / else komutları kullanabiliyoruz.

Şablon oluşturmak Django’nun en güçlü yanlarından biri, ayrıca öğrenmesi oldukça kolay. Ancak bu konuya yeni olan birine biraz karmaşık gelebilir. Endişe etmeyin, şu an amacımız view’i çalışır hale getirmek, şablon sisteminin detaylarını daha sonra inceleyeceğiz.

View fonksiyonu ve şablon hazır. Tek eksiğimiz bu ikisine hangi adresten ulaşacağımızı belirlemek.

urls.py dosyasını açıp aşağıdaki şekilde değiştirelim.

from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns(”, url(r’^admin/’, include(admin.site.urls)), url(r’^anasayfa/’,’gunluk.views.anasayfa’), )

Dosyaya url(r’^anasayfa/’,’gunluk.views.anasayfa’), satırını ekledik. Peki bu ne anlama geliyor ? İlk kısım ( ^anasayfa/ ) , gireceğimiz adresi belirlemek için düzenli ifadelerden faydalanıyor. İkinci kısımda ise ( ‘gunluk.views.anasayfa’ ) bu adrese tarayıcıda eriştiğimizde hangi view fonksiyonun çalışacağını gösteriyor.

Sıra geldi anasayfayı test etmeye!

komut satırına gidip

$ python manage.py runserver

komutunu kullanarak serverı çalıştırın

Şimdi de tarayıcımız da http://127.0.0.1:800/anasayfa/ adresine gidelim.

Herşey yolunda gittiyse en son yazdığınız mesajları ekranda görüyor olursunuz. Tebrikler ilk viewinizi oluşturdunuz.

Evet,view’imiz çalışıyor. Ancak bu dersi bitirmeden önce ufak bir değişiklik daha yapalım.

View’imizde render ve context kullanmaktayız. Bu fonskiyonlar view’deki değişkenleri şablona bağlamamızı sağlıyor. Django bu yöntem oldukça sık kullanıldığı için Django’yu geliştirenler bize kısa bir yol hazırlamışlar : render_to_response

render_to_response fonskiyonu sayesinde render ve context’i her defasında kullanmak zorunda kalmıyoruz. View’imizi render_to_response kullanarak değiştirelim.

from django.shortcuts import render_to_response
from gunluk.models import Mesaj

def anasayfa(request): son_mesajlar = Mesaj.objects.all().order_by(‘-giris_tarihi’)[:5] return render_to_response(“anasayfa.html”, {‘mesajlar’ : son_mesajlar } )

render_to_response bu örnekte 2 parametre alıyor. İlk parametremiz şablon ismi (anasayfa.html). Diğer parametre ise şablona göndermek istediğimiz değerleri tutan bir Python sözlüğü.

render_to_response bir HttpResponse nesnesi döndürdüğü için HttpResponse’u kullanmamıza gerek yok.

Artık view fonksiyonumuz çok daha kısa! Bundan sonra oluşturacağımız view’lerde render_to_response kullanacağız.

Django şablon sistemini daha yakından inceleyeceğiz. Aşağıda bir şablon örneği görüyorsunuz , şimdi onu satır satır açıklayacağız.

{% extends "base.html" %}

{% block icerik %}

<h3>Son Mesajlar</h3> {% for mesaj in mesajlar %} <div> <a href=”{{ mesaj.get_absolute_url }}”>{{ mesaj.baslik|truncatewords:”10″ }}</a> <span>Yazan : {{ mesaj.yazar }}</span> </div> {% endfor %}

{% endblock %}

Etiketler

Şablonumuz {% extends “base.html” %} kod parçası ile başlıyor. Bu bir etiket. Django şablonlarında {% .. %} şeklindeki kod parçalarına etiket diyoruz. Django bize birçok etiket sağlıyor , bunların bazıları : if , for , extends , ifequal , block…

if etiketi

Daha önce bir programlama dili kullandıysanız , if yapısını biliyorsunuzdur. Django’nun if etiketi o if yapısını şablonumuzda kullanmamıza imkan veriyor. if etiketinin kullanımına bir örnek :

{% if yazar %}
    Selam {{ yazar.isim }}
{% else %}
    Kimsen seen ?
{% endif %}

Bu örnekte Django yazar değişkenini kontrol ediyor. Eğer bu değişken mevcutsa, yani boş bir değer ya da False değilse, yazara bir karşılama mesajı gösteriyor. Aksi takdirde ise ekrana “Kimsen seen ?” yazdırıyor. if’in sonuna gelince ise etiketi kapatıyoruz. Django etiketlerinin bazılarını kullandıktan sonra kapatmamız gerekiyor ( if, for, block gibi ).

for etiketi

for etiketi şablonumuzda ‘for in’ döngüsü kullanmamızı sağlıyor. Örnek olarak :

{% for mesaj in mesajlar %}
    <span>{{ mesaj.baslik }}</span>
{% endfor %}

Bu örnekte for döngüsü ile mesajlar’ın içindeki her mesajın başlığını ekrana yazdırıyoruz.

Django ile birlikte yüklü gelen etiketlerin tam listesine buradan ulaşabilirsiniz.

Template’larda Kalıtım – extends ve block etiketleri

Django şablonlarının sağladığı en güçlü özelliklerden birisi , şablon kalıtımıdır. Kalıtım sayesinde bir iskelet şablon oluşturup, sayfalar arasında ortak olan kısımları tekrar yazmak zorunda kalmazsınız. Bu sizi hem extra işten kurtarır , hem size zaman kazandırır , hem de sayfalarınızda değişiklik yapacağınız zaman büyük kolaylık ve esneklik sağlar.

Bir kalıtım örneği oluşturalım. Öncelikle iskelet şablonumuz :

<html>
<head>
<title>{% block baslik %} Anasayfa {% endblock %}</title>
</head>
<body>
<div class="sayfa">
    <div class="icerik">
        {% block icerik %}
        <h2>Merhaba!</h2>
        <div>Programlama blogumuza hoşgeldiniz...</div>
        {% endblock %}
    </div>
    <div class="kategoriler">
        <ul>
            <li><a href="/python/">Python</a></li>
            <li><a href="/ruby/">Ruby</a></li>
            <li><a href="/haskell/">Haskell</a></li>
        </ul>
    </div>
</div>
</body>
</html>

Şablonumuzda {% block %} etiketlerini görüyorsunuz. Bu etiket sayfalar arasında farklılık gösteren kısımları ayırmamızı sağlıyor. Yani ‘block’ etiketi ile ayırdığımız kısımları , bu şablonu iskelet olarak kullanan şablonlarda değiştirebiliyoruz. Örneğin bu şablonu kullanıcıya Hoşgeldin mesajı üretmek için kullandığımızı düşünürsek, kategorilere ait mesajları listelediğimiz bir şablon aşağıdaki gibi olacaktır.

{% extends "anasayfa.html" %}

{% block baslik %} Kategori : {{ kategori.isim }} {% endblock %}

{% block icerik %} Mesajlar : {% for mesaj in mesajlar %} {{ mesaj.baslik }} <br /> {% endfor %} {% endblock %}

İşte kalıtımın bize sağladığı en önemli avantaj bu. Çok daha az kod kullanarak yeni bir şablon oluşturduk. Şablonun ilk satırındaki ‘extends’ etiketi bu şablonun “anasayfa.html” isimli iskelet şablondan kalıtıldığını söylüyor. Böylece tek yapmamız gereken iskelet şablonda ‘block’ etiketleri ile işaretlediğimiz kısımları yeniden yazmak oluyor.

Filtreler

Filtreler , şablonlarda ekrana yazacağımız verileri düzenlememizi sağlar. Filtre kod dizimi aşağıdaki gibidir ; değişkenin sonuna ‘|’yi ve ardından filtre ismini ekleriz.

{{ kitap.isim|lower }}

Bu örnekte ‘lower’ filtresi kitabın ismini küçük harflerle yazdırıyor.

Bazı filtre örnekleri :

{{ makale.icerik|truncatewords:"30" }}

truncatewords filtresi bir değişkenin belirli sayıda kelimesini döndürür. Bu örnekte bir makale içeriğinin ilk 30 kelimesini ekrana yazdırıyoruz.

truncatewords filtresinin ardından gelen ‘:30’ kısmı bu filtrenin parametresidir. Filtreler aslında Python fonksiyonlarıdır, bu sayede onlara parametre gönderebiliyoruz. Tabii gönderdiğimiz parametre sayısı fonksiyonun alacağı parametra sayısından fazla olamaz.

{{ sonuc|add:"2" }}

add filtresi değişkenin değerine parametre değerini ekler.

{{ ogrenci.isim|capfirst }}

capfirst değişkenin ilk harfini büyük harfe dönüştürür. “ali”->”Ali” olur.

Django ile yüklü gelen filtrelerin listesine buradan ulaşabilirsiniz.

Yorumlar

Django’da şablonumuza yorum ekleyebiliriz.

{% for makale in makaleler %}
    {# makale başlığını yazdır! #}
    {{ makale.baslik }}
{% endfor %}
Django ile Sitemap oluşturma

Django’nun bize sağladığı sitemap framework’ü sayesinde sitemap oluşturmak oldukça kolay.

Örneğin ; ‘Makale’ isminde bir modelimiz olduğunu farz edelim. Sitemap’imize makale linklerini eklemek istiyoruz. Bunun için uygulama klasörümüz içinde sitemap.py isminde bir dosya oluşturalım. Dosya içeriğini aşağıdaki gibi düzenleyelim :

from django.contrib.sitemaps import Sitemap
from blog.models import Makale

class MakaleSitemap(Sitemap): changefreq = “daily” priority = 0.5

def items(self): return Makale.objects.filter(yayinda = True)

def lastmod(self, obj): return obj.ekleme_tarihi

Sitemap sınıfımızı oluşturduk. Bu sınıfın metodlarından ‘items’ eklemek istediğimiz makaleleri döndürüyor, lastmod ise makalemizin yayınlandığı tarihi döndürüyor.

Şimdi urls.py dosyasını açalım ve sitemap için url’mizi ekleyelim.

# diğer import ifadeleri...
from sitem.blog.sitemap import MakaleSitemap

sitemaps = { “makale”: MakaleSitemap }

urlpatterns = patterns(”, # diğer url’lerimiz # sitemap url (r’^sitemap.xml$’, ‘django.contrib.sitemaps.views.sitemap’, {‘sitemaps’: sitemaps}) )

Böylece sitemap için gerekli url’yi de eklemiş oldu.

Son olarak ise INSTALLED_APPS alanına “django.contrib.sitemaps” satırını ekleyin.

Artık sitenizde :

http://www.siteismi.com/sitemap.xml

dosyasını ziyaret ederek sitemap’inize ulaşabilirsiniz.

Django Flatpages

Django , sitemizin düz HTML olacak sayfalarını kolayca oluşturmamız için Flatpages uygulamasını içerir. Flatpages uygulamasını kullanarak HTML sayfalarımızı çok kısa süre içerisinde oluşturabiliriz ( “hakkımızda” , “kurallar” , “iletişim” gibi sayfalar için ).

Flatpages kullanılarak oluşturulan bir sayfada Django’nun bizden istedikleri ise sayfamızın URL’si , başlığı ve içeriğidir.

Flatpages uygulamasının kurulumu :

1- ‘django.contrib.sites’ satırının INSTALLED_APPS’ta , ‘django.contrib.flatpages.middleware.FlatpageFallbackMiddleware’ satırının ise MIDDLEWARE_CLASSES’ta olduğundan emin olun.

2- ‘django.contrib.flatpages’ satırını INSTALLED_APPS’a ekleyin.

3- python manage.py syncdb komutunu çalıştırın.

Django gerekli veritabanı tablolarını oluşturdu. Şimdi admin paneline gidip bir flatpage sayfası yapalım.

Panel anasayfasında Flatpages tablosuna gidin ve yeni bir flatpage ekleme linkine tıklayın. Flatpage’imizin kısımlarını aşağıdaki şekilde doldurun :

URL : /kurallar/ Başlık ( Title ) : Site Kuralları İçerik ( Content ) : Django dışında bir framework kullanmak yasaktır

Save’e tıklayarak flatpage örneğimizi kaydedelim. Artık www.siteismi.com/kurallar/ adresine giderek yeni oluşturduğumuz flatpage’e ulaşabiliriz.

Django flatpages için bir şablon içeriyor. Ancak Django’nun sağladığı bu şablon bizim istediğimiz şey değil. Biz kendi şablonumuzu oluşturalım.

Şablonlarınızı kaydettiğiniz klasöre gidin ve içinde “flatpages” isminde yeni bir klasör oluşturun. Ardından bu klasörün içinde “default.html” isminde bir dosya oluşturun. Sonra da dosyayı açıp içini aşağıdaki gibi doldurun :

<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
    <div id="sayfa">
        {{ flatpage.title }}
        <br />
        {{ flatpage.content }}
    </div>
</body>
</html>

Dosyayı kaydedin ve www.siteismi.com/kurallar/ adresini tekrar ziyaret edin. Artık flatpage’imiz yukarıdaki şablonu kullanıyor. Eğer daha önceden hazırladığınız bir şablon var ise extends etiketini kullanarak o şablondan kalıtım sağlayabilirsiniz.

Django Statik Dosyalar

Bu derste Django projemize statik dosyaları (resim ya da css/javascript kaynağı gibi) eklerken yapmamız gerekenleri öğreneceğiz.

1- settings.py dosyasını açarak STATICFILES_DIRS kısmına gelelim. Buraya statik dosyaları saklayacağımız klasörün yolunu yazalım : “C:/Users/ugur/static/” gibi.

Yolu yazdıktan sonra ardından bir virgül eklemeniz gerekebilir : “C:/Users/ugur/static/”,

2- urls.py dosyasını açarak aşağıdai değişiklikleri yapın

# diğer import ifadeleri
from django.views.generic.simple import direct_to_template

# diğer url’ler (r’^static/(.*)$’,’django.views.static.serve’, {‘document_root’: ‘/dosya_yolu/’,’show_indexes’: True }),

Eklediğimiz url’deki dosya_yolu yazan yerine bilgisayarınızdaki dosya yolunu yazmayı unutmayın.

Bu değişiklikleri yaptıktan sonra aşağıdaki komut ile değişikleri aktifleştirelim

python manage.py syncdb

Evet hepsi bu kadar. Artık resimlerinizi veya css,javascript dosyalarınızı settings.py dosyasında STATICFILES_DIRS kısmına yazdığınız klasörün içine attıktan sonra onlara erişebilirsiniz.

Bu dosyalara erişmek için şablonlarınızda dosya yolu yazmak yerine STATIC_URL değişkenini kullanabilirsiniz. Örneğin :

“C:/Users/ugur/statik/resim.jpg” yerine “{{STATIC_URL}}resim.jpg” kullanın

  1. 26/06/2012, 10:14

    süper anlatım , en geniş kapsamlı Türkçe kaynak

    Beğen

  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: