You are hereBlogs > jittat's blog > Template inheritance
Template inheritance
ความสามารถที่น่าสนใจของ template ใน django อีกอย่างหนึ่ง (นอกจากความเข้มงวดในการใช้ code ใน template) ก็คือ template inheritance
อธิบายง่าย ๆ ก็คือความสามารถที่ template จะสืบทอดหน้าตามาจาก template อื่น ๆ แล้วก็ปรับแต่งเฉพาะส่วนที่ต้องการ ซึ่งใน django แต่ละส่วนใน template ที่ปรับแต่งได้นี้จะเรียกว่า block
ดูตัวอย่างดีกว่าครับ ด้านล่างเป็น template ชื่อ base.html สังเกตว่าเราเปิดการประกาศ block ด้วย tag block พร้อมด้วยชื่อ แล้วปิดด้วย endblock
<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 ใหม่
{% 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 ยังทำได้หลายทอด โดยจะสืบทอดกันไปกี่ทอดก็ได้
- jittat's blog
- Login or register to post comments

เหมือน JSF facelets เลยครับ :D อารมณ์เดียวกันเลย
ชักสงสัยว่าจะมีอะไรที่อีกฝ่ายทำไม่ได้บ้างหรือเปล่าแล้วแหะ
ไอเดียมันไหลไปไหลมารวดเร็วจนมีให้ใช้กันหมด
แต่รู้สึกว่า rails จะยังทำขนาดนี้ไม่ได้นะครับ (ทำได้ขั้นเดียว เป็น layout)
+1 เริ่มชอบ Django ก็เพราะฟีเจอร์นี้เลยครับ : )
@jittat ใน rails มี content_for ครับ คิดว่าคงพอฟัดพอเหวี่ียงกับ block ใน django ครับ