Sunday, September 26, 2010

Learning Django: Template

จากตอนที่แล้วจะเห็นว่าการสร้าง view ขึ้นมายังจะต้องยุ่งยากในการ print html tag ขึ้นมาอีกซึ่งไม่ต่างกับ PHP เท่าไร ใน Django เราแก้ปัญหานี้โดยใช้ template

Template

ใน Django เราสามารถสร้าง template สำหรับแสดงผล (presentation) ให้แยกกับส่วน logic ลองมาดู concept ของ template กันอย่างกระชับ

เริ่มจากการเปิด python prompt แล้ว ลอง code ต่อไปนี้


>>> from django import template
>>> t = template.Template('My name is {{ name }}.')
>>> c = template.Context({'name': 'Adrian'})
>>> print t.render(c)
My name is Adrian.
>>> c = template.Context({'name': 'Fred'})
>>> print t.render(c)
My name is Fred.

ลองมาดู code กัน
1. import template เข้ามา
2. สร้าง template ชื่อ t
3. สร้าง context  c ขึ้นมา โดยใน context นี้มีค่า name=Andrian
4. ให้ template t แสดงผลโดยอ้างอิง context c จะได้ผลลัพธ์ออกมา
5. เปลี่ยนค่า context c โดยให้ name=Fred
6. ให้ template t แสดงผลโดยอ้างอิง context c จะได้ผลลัพธ์ออกมา เนื่องจาก context c เปลี่ยนค่าไป ผลจึงออกมาไม่เหมือนเดิม

เรานำ template มาประยุกต์ใช้กับ view ได้หลายวิธี แต่วิธีแนะนำเพื่อที่จะแยก ระหว่าง presentation กับ logic ขั้นตอนมีดังนี้

1. กำหนด template directory ใน settings.py โดย TEMPLATE_DIRS ในที่นี้จะสร้าง folder ที่ชื่อ templates ใน folder mysite


import os.path
....................
TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/'),
)

2. เพิ่ม code ส่วนนี้ไปใน views.py



from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime


def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)

หรือเราจะใช้ feature ที่ชื่อ shortcut ใน Django เพื่อประหยัดการเขียน code

from django.shortcuts import render_to_response


import datetime


def current_datetime(request):
    now = datetime.datetime.now()
    return render_to_response('current_datetime.html', {'current_date': now})


โดย current_datetime.html จะเป็น html ไฟล์ที่มี Tag (คล้ายๆ PHP) โดยส่งค่า context ไปให้(ในกรณีนี้ current_date เป็น object ประเภท datetime)


Template Tag

ในส่วนนี้เราจะสรุป Template Tag คร่าวๆ

1. Tag ใน template จะอยู่ในเครื่องหมายปีกกา {} (คล้ายๆ PHP อยู่ระหว่า )
2. การอ้างอิงถึง variable ทำได้โดย ใช้ {{ variable_name }}
3. มี control ต่างๆ ดังนี้
    - {% if %}, {% else %}, {% endif %}
    - {% for %}, {% endfor %}
    - {% ifequal %},{% ifnotequal %}, {% endifequal %}, {% endifnotequal %}
4. comment 
    - บรรทัดเดียวใช้ {# #}
    - หลายบรรทัดใช้ {% comment %}, {% endcomment %}
5. สามารถใช้ filter ได้
    - {{ name|lower }} เป็นการเปลี่ยนค่า name ให้เป็น lower case
    - filter สามารถ pipe ได้ {{ my_list|first|upper }} เป็นการดึงค่าแรกใน my_list ออกมาแล้วเปลี่ยนเป็น upper case


3 comments:

  1. >>> from django import template
    >>> t = template.Template('My name is {{ name }}.')

    Traceback (most recent call last):
    File "", line 1, in ?

    อยากจะให้อธิบายหน่อย ครับ

    ReplyDelete
  2. หมายถึง code หรือว่า error ที่เกิดขึ้นครับ
    ถ้าเป็น code นี่ อธิบายง่ายๆ สำหรับคนเคยเขียน PHP
    ข้อความ 'My name is {{ name }}.' เปรียบเสมือน ไฟล์ PHP
    ไฟล์หนึ่ง (แต่เราไม่ได้เขียนใส่ไฟล์ต่างหาก) ซึ่งติดตัวแปร name อยู่
    เราให้ค่า name ผ่านทาง context ที่ชื่อว่า c

    ส่วน error ขอ error ทั้งหมดนะครับ

    ReplyDelete
  3. This design is spectacular! You definitely know how to keep a reader entertained.
    Between your wit and your videos, I was almost moved to start my own blog (well, almost...HaHa!) Great job.
    I really loved what you had to say, and more than that,
    how you presented it. Too cool!

    Also visit my web page บริการ seo ราคาถูก

    ReplyDelete