23 Şubat 2014 Pazar

Django Şablonları

Django şablonlarının kullanmaya başlayabiliriz.









Örnek üzerinden açıklamaya başlayalım.
# -*- coding: utf-8 -*-

from django import template

s = template.Template("Takım Adı:{{adi}}")
b = template.Context({"adi":"Galatasaray"})
print s.render(b)
Bu kod parçasını çalıştırmaya çalışırsanız şu şekilde bir hata ile karşılaşabilirsiniz.
Traceback (most recent call last):
  File "/home/mazlumagar/Django/mysite/sablonn.py", line 7, in 
    b = template.Template("Takım Adı:{{adi}}")
  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 123, in __init__
    if settings.TEMPLATE_DEBUG and origin is None:
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 54, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 47, in _setup
    % (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATE_DEBUG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
Bu hatadan kurtulabilmek için konfigürasyon işlemini yapmamız gerekiyor. Bunun için 2 satır kod ekleyeceğiz ve programımızın son durumu şu şekilde olacak.
# -*- coding: utf-8 -*-

from django import template
from django.conf import settings

settings.configure(DEBUG=True,Template_DEBUG=True)

s = template.Template("Takım Adı:{{adi}}")
b = template.Context({"adi":"Galatasaray"})
print s.render(b)
Burada s nesnesine şablon, b nesnesine bağlam denir. Bağlamlar içerisinde {{ }} arasındaki değişkenlere bağlam değişkeni denir. s.render(b) işlemine ise s şablonun b bağlamı ile yorumlanması diyoruz. İsterseniz s nesnemizi yazdıralım ve sonucunu görelim.
s = template.Template("Takım Adı:{{adi}}")
b = template.Context({"adi":"Galatasaray"})
print s

template tipinde bir nesne olduğunu görebilirsiniz.
Bir şablon nesnesini istediğimiz kadar şablon ile yorumlayabiliriz.
s = template.Template("Takım Adı:{{adi}}")
takimlar = ["Galatasaray","Fenerbahçe","Beşiktaş"]
for i in takimlar:
    b = template.Context({'adi':i})
    print s.render(b)
Takım Adı:Galatasaray
Takım Adı:Fenerbahçe
Takım Adı:Beşiktaş
Bağlama Değer Gönderme
Şablona veri aktarırken sözlük kullandığımızı fark etmişsinizdir. Şuana kadar gönderdiğimiz sözlükler hep basit haldeydi. Eğer istersek sözlük anahtarlarının değerlerini sözlük,liste gibi veri yapıları da yapabiliriz.
ogrenci = {"isim":"Ahmet Yapıcı","bolum":"Bilgisayar Mühendisliği"}
s = template.Template("{{ogrenci.isim}} isimli öğrenci {{ogrenci.bolum}} bölümünde okuyor")
b = template.Context({"ogrenci":ogrenci})
print s.render(b)
Ahmet Yapıcı isimli öğrenci Bilgisayar Mühendisliği bölümünde okuyor
Gördüğünüz gibi gönderdiğimiz sözlük içindeki ogrenci anahtarının değerini başka bir sözlük olarak tanımladık. Burada dikkat etmeniz gereken en önemli şey gönderdiğimiz sözlük değeri içerisindeki elemanlara ulaşırken ogrenci[adi] şeklinde değilde ogrenci.adi şeklinde kullandık. Aynı şekilde değer olarak bir liste de kullanabiliriz.
bolumler = ["Bilgisayar","Makina","Mekatronik"]
s = template.Template("Sakarya Üniversitesinde {{ bolum.0 }} , {{ bolum.1 }} , {{ bolum.2 }} gibi mühendislikler bulunur.")
b = template.Context({"bolum":bolumler})
print s.render(b)
Sakarya Üniversitesinde Bilgisayar , Makina , Mekatronik gibi mühendislikler bulunur.
Aynı mantıkla liste elemanlarına ulaşırken bolum[index] yerine bolum.index yazım biçimini kullandık.
Şimdi sözlük ve listeyi bir arada kullanabileceğimiz bir örnek yapalım.
takimlar = ['Galatasaray','Fenerbahçe','Beşiktaş']
oyuncu = {"adi":"Wesley Sneijder","yasi":27}
oyuncu2 = {"adi":"Tolga Zengin","yasi":30}

oyuncular = {"takimlar":takimlar,"oyuncu":[oyuncu,oyuncu2]}

s = template.Template("{{ oyuncular.oyuncu.0.yasi }} yaşındaki {{ oyuncular.oyuncu.0.adi }} {{oyuncular.takimlar.0}}'da oynamaktadır")
b = template.Context({"oyuncular":oyuncular})
print s.render(b)
27 yaşındaki Wesley Sneijder Galatasaray'da oynamaktadır
Bu şekilde iç içe istediğimiz kadar liste veya sözlük tanımlayarak elemanlarına ulaşabiliriz. Son olarak Python'ın bize sağlamış olduğu bir modülü kullanacağımız bir örnek verelim.
__author__ = 'mazlumagar'
# -*- coding: utf-8 -*-

from django import template
from django.conf import settings
import datetime

settings.configure(DEBUG=True,Template_DEBUG=True)

t = datetime.date(2013,12,12)

s= template.Template("{{ tarih.year }} yılındayız.")
b = template.Context({"tarih":t})
print s.render(b)
2013 yılındayız.
Bu şekilde sizde örnekleri çoğaltarak Şablon yapısını daha iyi anlayabilirsiniz.
Context Objesi:
Context Objesi üzerinden istediğimiz gibi oynamalar yapabiliriz. Daha öncede söylediğimiz gibi sözlük gönderiyoruz. Bu yüzden sözlükler için geçerli olan kurallar burada da geçerlidir.
# -*- coding: utf-8 -*-

from django import template
from django.conf import settings

settings.configure(DEBUG=True,Template_DEBUG=True)

c = template.Context({"isim":"Mazlum"})
print c['isim']

##Var olan anahtarın değerini değiştirdik.
c['isim'] = "Okan"
print c['isim']

##yeni anahatar-değer ekledik.
c['yas'] = 20
print c['yas']

##Var olan anahatarı sildik.
del c['yas']
print c['yas']
Kaynakça:

1 yorum :

  1. Merhabalar;
    Öncelikle ellerinize sağlık. Ben çok yararlanıyorum. Bu harika kaynak için sizlere teşekkür ederim.

    Sizin yukarıda verdiğiniz ornekleri bir "ornekler.py" dosyasi icine yapistirdim. Bu dosya command prompt icinden
    "python ornekler.py"
    seklinde calistirdigimda calisiyor. Ancak bu dosyayi IDLE icinden acip calistirmaya ugrastigimda su hatayi aldim:

    Traceback (most recent call last):
    File "C:\Python27\ilkProjem\ilkProjem\ornekler.py", line 13, in
    print s.render(b)
    File "C:\Python27\lib\idlelib\PyShell.py", line 1353, in write
    s = unicode.__getslice__(s, None, None)
    TypeError: an integer is required

    Bu beklenen birşey mi, yoksa biryerlerde hata mı yapıyorum?

    Tekrar teşekkür ederim.

    -Mehmet

    YanıtlaSil