Templates
Template 是 Django 用來產生 HTML 畫面的樣板檔案,語法接近 HTML,但額外提供變數輸出與流程控制的標籤,讓後端資料可以動態嵌入畫面。View 透過 render() 把資料(context)交給 Template,Template 再依內容產生最終的 HTML 回傳給瀏覽器。
官方文件:Templates。
Template 檔案放在哪裡
預設會在每個 App 底下的 templates/ 目錄尋找樣板,並建議在裡面再建立一層與 App 同名的子目錄,避免不同 App 的樣板檔名互相覆蓋:
View 中用相對於 templates/ 的路徑引用:
兩種基本語法
Django 樣板語言主要有兩種標記:
{{ 變數 }}:輸出變數的值。{% 標籤 %}:執行邏輯,例如迴圈、條件判斷、載入樣板。
<h1>{{ page_title }}</h1>
<ul>
{% for post in posts %}
<li>{{ post.title }}({{ post.created_at }})</li>
{% empty %}
<li>目前還沒有文章。</li>
{% endfor %}
</ul>
{% if user.is_authenticated %}
<p>歡迎回來,{{ user.username }}!</p>
{% else %}
<p><a href='{% url "login" %}'>請先登入</a></p>
{% endif %}
{{ 變數 }} 也支援用點號(.)存取屬性、字典的 key,或呼叫沒有參數的方法,例如 {{ post.author.username }};另外可以用管線符號 | 套用過濾器(filter)轉換輸出,例如 {{ post.created_at|date:"Y-m-d" }}。
樣板繼承
多數網站的每一頁都共用同一套版型(導覽列、頁尾等),Django 用樣板繼承避免重複撰寫。先定義一個基礎樣板,用 {% block %} 標出子樣板可以覆寫的區塊:
{# templates/base.html #}
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<title>{% block title %}我的網站{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
子樣板用 {% extends %} 繼承,並只需要覆寫需要客製的區塊:
{# templates/myapp/home.html #}
{% extends "base.html" %}
{% block title %}首頁{% endblock %}
{% block content %}
<h1>歡迎光臨</h1>
{% endblock %}
載入靜態資源
樣板中要引用 CSS、JavaScript、圖片等靜態檔案時,須先載入 static 標籤庫,細節與部署方式請見 Static Files:
下一步
畫面串好資料來源後,接著看資料實際存在哪裡、怎麼查詢:Models。