Template inheritance

Posted September 27, 2008 at Django66

ความสามารถที่น่าสนใจของ template ใน django อีกอย่างหนึ่ง (นอกจากความเข้มงวดในการใช้ code ใน template) ก็คือ template inheritance

อธิบายง่าย ๆ ก็คือความสามารถที่ template จะสืบทอดหน้าตามาจาก template อื่น ๆ แล้วก็ปรับแต่งเฉพาะส่วนที่ต้องการ ซึ่งใน django แต่ละส่วนใน template ที่ปรับแต่งได้นี้จะเรียกว่า block <!--break--> ดูตัวอย่างดีกว่าครับ ด้านล่างเป็น template ชื่อ base.html สังเกตว่าเราเปิดการประกาศ block ด้วย tag block พร้อมด้วยชื่อ แล้วปิดด้วย endblock

<html>
<body>
<h1>{% block title %}Sample Application{% endblock %}</h1>
<div style="border: 1px dashed black; background: #dddddd">
  {% block subtitle %}
    This application shows template inheritance
  {% endblock %}
</div>

{% block body %}
  <p>
    This is the first page. you'd probably don't like it.
    Try <a href="{% url template.sample.views.user %}">this</a>.
  </p>
{% endblock %}

<p>
  Some more stuff that won't change.
</p>

</body>
</html>

ในตัวอย่างข้างต้นได้ประกาศ block ไว้สาม block คือ title, subtitle และ body

สังเกตว่าใน template ข้างต้นมีการเรียกใช้ tag url เพื่อสร้าง url ของฟังก์ชันที่ต้องการ โดยในการสร้างจะใช้การตั้งค่าที่เราระบุไว้ใน urlpatterns การระบุ url แบบนี้ทำให้เราสามารถเปลี่ยนการ map url ได้โดยไม่ต้องแก้ template

หน้า template นี้เมื่อ render ก็จะแสดงผลตามปกติ ดังด้านล่าง

ทีนี้ เราสามารถสร้างอีก template หนึ่งให้เรียกใช้ template ข้างต้นได้ โดยใช้ tag extends จากนั้นถ้าต้องการแก้ block ใด ก็ประกาศ block เหล่านั้นเสียใหม่ ส่วน block ที่เราไม่ได้ประกาศก็จะไม่มีการเปลี่ยนแปลง

Template ด้านล่างประกาศ block subtitle และ body ใหม่

{% extends "base.html" %}

{% block subtitle %}
  You are in user page.
{% endblock %}

{% block body %}
  <p>
    You see that this text changes
    and the subtitle changes.
    The title and the text below remain the same..
  </p>
{% endblock %}

ซึ่งแสดงผลเป็น

ความสามารถนี้เป็นที่ถูกอกถูกใจหลายคน เพราะว่าเราสามารถแบ่ง template ให้เป็นส่วน ๆ เพื่อการปรับแต่งได้ง่ายมาก นอกจากนี้การ inheritance ยังทำได้หลายทอด โดยจะสืบทอดกันไปกี่ทอดก็ได้

ส่งอีเมลง่ายสุดๆ ด้วย Seam

Posted October 14, 2008 at Seam66
Seam ไม่ใช่แค่ MVC เวบเฟรมเวิร์กเท่านั้น แต่มันพยายามทำตัวเป็นเครื่องมือสดวกใช้ให้กับนักพัฒนาอีกด้วย งานอย่างเช่นการ สร้าง captcha ออกรายงาน ทำ feed หรือรับส่งอีเมล แม้จะเล็กน้อยแต่ก็เป็นเรื่องที่พบเห็นได้ทั่วไปในเวบสมัยนิยมเวลานี้ Seam เป็นตะเข็บคอยเชื่อมโยงเพื่อให้งานรองๆ (แต่สำคัญ) เช่นนี้ ทำตัวสมกับเป็นเรื่องรองจริงๆ และกลายเป็นเรื่องที่เบ็ดเสร็จในตัว ง่ายในการผลิต บทความตอนนี้จะพูดถึงการส่งอีเมลด้วย Seam หลังจากอ่านจบผมคิดว่าคุณน่าจะรู้สึกเช่นเดียวกับผม ว่าการส่งอีเมลด้วย Seam เป็นเรื่องง่าย ตรงตัว สมเหตสมผลที่สุดวิธีหนึ่ง และยากที่จะหาวิธีการอื่นที่คล่องแคล่วรวดเร็วกว่ามาเทียบเคียง เป็น theme ความรู้สึกเดียวกันที่ได้หากเอาฟีเจอร์อื่นของ Seam มาเทียบบัญญัตไตรยางค์หาค่าความสุขในการพัฒนา Seam งัดขีดความสามารถ Facelets Seam ใช้ระบบ template ในการสร้างอีเมลต้นแบบ คุณไม่ต้องเรียนรู้ภาษาใหม่ หรือเทคโนโลยีอื่นเพื่อจะเข้าใจระบบการทำงานของมัน เพราะ Seam งัดเอาพลังของ Facelets, เทคโนโลยีเดียวกันที่นิยมใช้เป็น JSF view handler มาใช้นั่นเอง อย่าแปลกใจไป ถ้ามันไม่ทำให้รู้สึกต่างกับตัวอย่างส่วน view อื่นๆ ก่อนหน้าที่เคยยกมา โค้ดข้างล่าง ผมเชื่อว่าไม่ต้องการคำอธิบายอะไร [...]

ตกแต่ง Pagination ด้วย Inclusion Tags

Posted October 17, 2008 at Django66

จากบันทึก "ทำ simple tag ใช้เอง" ของ @jittat คราวก่อน ทำให้เราพอจะเห็นภาพของ custom tag ชนิดแรกไปบ้างแล้ว คราวนี้ลองมาดูอีกชนิดหนึ่ง ซึ่งก็คือ inclusion tag ครับ

และจากบันทึกก่อนหน้านี้ "include tag และ ajax" ทำให้เราพอจะสรุปง่ายๆ ได้ว่า

simple tag + include tag = inclusion tag

นั่นก็คือ inclusion tag มันทำงานเหมือน simple tag แต่ต้องการ template เพื่อมาแสดงผลลัพธ์

สาเหตุที่ทำให้ต้องมาใช้ inclusion tag คือผมต้องการทำ [pagi

read more

Authkit: การแก้หน้าลงทะเบียนเข้าอย่างง่าย

Posted March 01, 2009 at Pylons66
หลังจากที่ผมใช้ AuthKit แบบใช้ form มาสักพัก มันก็เป็นหน้าขาวๆ ธรรมดาก็เลย อยากเปลี่ยนหน้านั้นให้ดูเหมือนหน้าอื่นๆ ผู้ใช้จะได้ไม่งงด้วย การทำอย่างนั้นก็ก็ต้องมีวิธีพิเศษนิดหน่อย ซึ่งในที่สุดก็หาวิธีได้จาก http://jimmyg.org/2007/08/14/pylons-mako-templates-in-authkit/ และคำแนะพร้อม code ของ @sirn แต่เพิ่มเก็บไว้ดูเอง ผมก็เลยทำตัวอย่างที่ง่ายขึ้นอีก เพื่อความเข้าใจมากกว่าเพื่อเอาไปใช้จริงๆ ขั้นตอนในการแก้ฟอร์มที่ใช้ลงทะเบียนเข้าคือ แก้ In development.ini เพิ่ม “authkit.form.template.obj” เข้าไป authkit.setup.enable = true authkit.setup.method = form, cookie authkit.form.authenticate.user.type = basaasa.users.authkit_elixir_driver:UsersFromDatabase authkit.form.authenticate.user.data = basaasa.model authkit.cookie.secret = SomeSec authkit.cookie.signoutpath = /auth/signout authkit.form.template.obj = basaasa.lib.auth:make_template #เพิ่ม เพิ่ม auth.py เข้าไปใน /basaasa/lib auth.py: def make_template(): return """ Signin
BasaAsa: Signin

สร้างหน้าลงทะเบียนเข้าใช้งาน สำหรับ AuthKit OpenID

Posted March 04, 2009 at Pylons66
ผมใช้ AuthKit และ OpenID บนโปรแกรมของผมที่เขียนด้วย พอเริ่มจะได้ได้แล้วผมก็อยากจะแก้หน้าลงทะเบียนเข้าใช้งาน (Sign in) สักหน่อย. จริงๆ แล้วก็แก้ได้ง่ายๆ เพราะว่าใช้วิธีคล้ายๆ กับการสร้างหน้าลงทะเบียนเข้าใช้งานใหม่สำหรับ AuthKit + form นอกจากจะเขียนถึงตัวอย่างแล้ว ผมก็จะพยายามอธิบายด้วยนิดหน่อย สมมุติว่าใช้ AuthKit + OpenID ได้อยู่แล้วจะแก้หน้าลงทะเบียนเข้าใช้ใหม่ผมก็เริ่มแก้ไขจาก development.ini ให้ชี้ไปที่ template ใหม่ authkit.openid.template.obj = topenid.lib.signin:make_template นอกจากนั้นก็เพิ่ม 2 ไฟล์เข้าไป ได้แก่ topenid/lib/signin.py และ topenid/template/signin.html topenid/lib/signin.py: # This file is based on example from http://jimmyg.org/2007/08/14/pylons-mako-templates-in-authkit/ from pylons.templating import Buffet from pylons import config import topenid.lib.helpers as h class MyBuffet(Buffet): [...]