5 Aralık 2013 Perşembe

Django'da Şablonlar 2


     Merhaba Arkadaşlar,

     Django'da Şablonlar adlı bloğumda sizlere şablonları ve şablon kullanımını anlatmıştım. Bu hafta ise şablonları kullanırken Django'nun bize sunduğu kolaylığı anlatmak istiyorum.

     Geçen hafta yaptığımız uygulamada öğrencilerin notlarını ve başarı durumlarını gösteren bir web sayfası şablonuyla çalışmıştık. Ve views.py dosyamız aşağıdaki gibiydi.

views.py
# -*- coding: utf-8 -*-

from django.http import *
from django.template import Template, Context



def notlar(request):
    ogrenciler =((u'Kadir',u'Guler',40,85,75,True),
                 (u'Ahmet',u'Baba',22,58,36,False),
                 (u'Suzan',u'Keskin',65,75,95,True),
                 (u'Ufuk',u'Hakan',45,15,36,False),
                 (u'Hayrettin',u'Öğüt',50,69,50,True),
                 (u'Mehmet',u'Kaan',42,85,25,True),
                 (u'Ayşe',u'Sanem',35,90,75,True),
            )    s=Template(open('C:...\\deneme\deneme\\sablonlar\\notlar.html').read()) (1)

    b = Context({'ogrenciler' : ogrenciler})      (2)

html = s.render(b) (2)

return HttpResponse(html) (3)


Yukardaki kod satırlarını inceledikten sonra : "Bütün herşeyi ben yaptım! Hani kolaylık bunun neresinde?" der gibiyiz. Aslında geçen hafta konuya tam anlamıyla hakim olabilmek için herşeyi uzun uzadıya yazmak istedim. Şimdi ise Django'nun bizlere sağladığı kolaylıklara bakalım.

Yukarıda yazdığımız kodlar sırasıyla şu işlemleri yapıyor:
  1. Şablonu çağırma
  2. Veriyi bağlam haline getirmek
  3. Bunu yorumlatmak
Şimdi saydığımız şu üç işlemi Django'nun bize sunduğu kolaylılardan biri olan render_to_response() işlemi ile yapalım. render_to_response() işlevi yukarda saydığım şablon çağırma, veriyi bağlam haline getirme ve yorumlama işlemlerinin tamamını tek satırda yapmamı sağlıyor. Bunu aşağıdaki şekilde yapalım ve aynı işlemi daha az kod satırıyla yaptığımızı görelim.

views.py
...
from django.shortcuts import render_to_response

def notlar(request):
    ogrenciler =((u'Kadir',u'Guler',40,85,75,True),
                 (u'Ahmet',u'Baba',22,58,36,False),
                 (u'Suzan',u'Keskin',65,75,95,True),
                 (u'Ufuk',u'Hakan',45,15,36,False),
                 (u'Hayrettin',u'Öğüt',50,69,50,True),
                 (u'Mehmet',u'Kaan',42,85,25,True),
                 (u'Ayşe',u'Sanem',35,90,75,True),
            )
    
    return render_to_response('notlar.html',{'ogrenciler':ogrenciler})
...

Aynı zamanda Django'nun bizlere sunduğu bir diğer kolaylık ise; görünüm altında tanımlanmış nesne isimlerinden oluşan bir sözlük döndürmesidir. Yani  {'ogrenciler': ogrenciler} ile belirtilen sözlüğe locals() işlevi ile ulaşabiliriz. Bu işlev, görünüm içerisindeki nesneyi şablonları yorumlamaya gönderirken karışıklık olmasını önler.

    Bir şablon dizininde alt dizinler de bulunabilir. Bu alt dizinlerdeki şablonları kullanırken, şablon isminden önce alt dizinin adı yazılır. Örneğin yukarıdaki örneğimizde  C:...\deneme\deneme\sablonlar gibi bir şablon dizinimiz vardı. Bu dizine  C:...\deneme\deneme\sablonlar\alt_sablonlar gibi bir alt dizindeki şablonu görünümümüzde kullanmak için render_to_response() işlevimizi aşağıdaki gibi kullanırız.

 
return render_to_responde('alt_sablonlar\yeni_sablon.html',locals())

İÇ İÇE ŞABLONLAR

Artık web sayfaları o kadar karmaşık yapılıyor ki, bir sayfanın tamamının tek bir şablon ile oluşturulması neredeyse imkansız bir hal aldı. Üstelik web sayfalarının çoğu ortak bileşenlerden oluşmaktadır. Örneğin sayfanın solunda ya da üst bölümünde gezinmeyi sağlayan bölümler bulunmaktadır. Bu gezinti bölümleri her sayfada aynı olduğuna göre bu kısımları tüm şablonlara yazmaya gerek yoktur. O halde bir kereliğine hazırlayıp istediğimiz şablon içerisinden çağırmamız çok daha kolay olacatır. Bu işlemi include etiketi ile yaparız. Örneğin geçen hafta yaptığımız örneğe alt ve üst bilgi ekleyelim. Bunu da farklı iki şablonu çağırarak yapalım.

Önce projemizde kullanacağımız şablonları depoladığımız  C:\...\deneme\sablonlar konumana icerilen_sablonlar diye bir alt dizin oluşturalım. Buraya alt ve üst bilgi için oluşturacağımız şablonları ekleyeceğiz. Şimdi de buraya ust_bilgi.html diye bir şablon ekleyelim. İçeriği aşağıdaki gibi olsun.

ust_bilgi.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 TRANSITIONAL//EN">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title> {{sayfa_basligi}} </title>
</head>
<body>
     Üst bilgi...
     
<hr>     

Ve alt_bilgi.html diye bir şablon oluşturalım. Bu da sayfanın altında bilgi veren bir şablon olsun. İçeriği de :

alt_bilgi.html
<hr>
Alt bilgi...

<br> Erişim zamanı: {{simdiki_zaman}}

</body>
</html>

Şimdi de notlar.html şablonunu yukarda yazdığımız iki şablonu içerecek şekilde değiştirelim. Yukarda da söylediğim gibi bu işlemi include etiketi ile yapacağız. Şöyle ki:

notlar.html
{% include "icerilen_sablonlar/ust_bilgi.html" %}

    <table border="1">
        <tr><th> Sıra </th><th> Adı </th>  <th> Soyadı </th> 
        <th> Vize </th> <th> Ödev </th><th> Final </th><th> Başarı Durumu </th><tr>
        {% for ogr in ogrenciler %}            
            <tr><td>{{forloop.counter}}</td>
            <td>{{ogr.0}}</td>
            <td>{{ogr.1}}</td>
            <td>{{ogr.2}}</td>
            <td>{{ogr.3}}</td>
            <td>{{ogr.4}}</td>
            <td>{% if ogr.5 %} BAŞARILI
                {% else %}     BAŞARISIZ
                {% endif %}
            </td></tr>
        {% endfor %}
    </table>
    
{% include "icerilen_sablonlar/alt_bilgi.html" %}

Şimdi de sıra ust_bilgi.html ve altbilgi.html şablonlarında tanımladığımız sayfa_basligi ve simdiki_zaman değişkenlerini görünümümüzde tanımlamamıza geldi. Bunu da views.py dosyasındaki notlar() işlevine şöylece ekleyelim.

views.py
...
def notlar(request):
    ogrenciler =((u'Kadir',u'Guler',40,85,75,True),
                 (u'Ahmet',u'Baba',22,58,36,False),
                 (u'Suzan',u'Keskin',65,75,95,True),
                 (u'Ufuk',u'Hakan',45,15,36,False),
                 (u'Hayrettin',u'Öğüt',50,69,50,True),
                 (u'Mehmet',u'Kaan',42,85,25,True),
                 (u'Ayşe',u'Sanem',35,90,75,True),
            )

    sayfa_basligi =u'NOT LİSTESİ'
    simdiki_zaman= time.ctime()
    return render_to_response('C:\\...\\deneme\\deneme\\sablonlar\\notlar.html', locals())
...



Artık aşağıdaki adrese gittiğimizde şablonları tek bir sayfada görebildiğimizi göreceksiniz.
http://localhost:8000/notlar

Ve sayfa görüntümüz de şu şekilde olacaktır:




















Hiç yorum yok:

Yorum Gönder