之前的例子中,HttpResponse都是把結果直接顯示在頁面上,也就是頁面的設計寫死在視圖函數的代碼裡的。如果想改變頁面的樣子,就行需要修改 Python 代碼,這樣很不友善。 Django 提供了模闆系統,隻要建立一個視圖,就可以将頁面的設計從代碼中分離出來。
Django 做為一個 Web 架構,采用了模闆來動态生成 HTML。模闆包含所需 HTML 輸出的靜态部分以及一些描述如何插入動态内容的特殊文法。
一個 Django 項目可以配置一個或多個模闆引擎。Django 為自己的模闆系統(創造性地稱為 Django 模闆語言 (DTL))和流行的替代方案 Jinja2 提供了内置後端。其他模闆語言的後端可從第三方獲得。
Django 定義了一個标準的 API,用于加載和渲染模闆,與後端無關。加載包括查找給定辨別符的模闆并對其進行預處理,通常将其編譯為記憶體中的表示形式。渲染意味着用上下文資料插入模闆并傳回結果字元串。
Django 模闆語言是 Django 自己的模闆系統。推薦使用 DTL。由于曆史原因,對模闆引擎的通用支援和 Django 模闆語言的實作都位于 django.template 命名空間中。
建立模闆template
在 mysite 目錄下建立 templates 目錄,并添加 index.html 檔案,目錄結構如下:
為了讓 Django 模闆引擎能夠找到 templates 路徑,需要在 mysite/settings.py 檔案中的 templates 節點,設定DIRS 内容。DIRS 定義了一個目錄清單,引擎應該在其中按搜尋順序查找模闆源檔案。在下圖中設定了 templates 路徑在項目的根目錄下。
Django 模闆語言
Django 模闆隻是使用 Django 模闆語言标記的文本文檔或 Python 字元串。一些構造被模闆引擎識别和解釋。主要的是變量和标簽。
使用上下文呈現模闆。渲染用它們的值替換變量,這些值在上下文中查找,并執行标簽。其他一切都按原樣輸出。
Django 模闆語言的文法涉及四個部分:
變量
變量從上下文中輸出一個值,它是一個類似字典的對象,将鍵映射到值。
變量被 {{ 和 }} 包圍,如下所示:
My first name is {{ first_name }}. My last name is {{ last_name }}.
使用 {'first_name': 'John', 'last_name': 'Doe'} 的上下文,此模闆呈現為:
My first name is John. My last name is Doe.
字典查找、屬性查找和清單索引查找是用點符号實作的:
{{ my_dict.key }}
{{ my_object.attribute }}
{{ my_list.0 }}
标簽
标簽在渲染過程中提供任意邏輯。這個定義故意含糊不清。例如,标簽可以輸出内容,用作控制結構,例如“if”語句或“for”循環,從資料庫中擷取内容,甚至啟用對其他模闆标簽的通路。
标簽被 {% 和 %} 包圍,如下所示:
{% csrf_token %}
一些标簽需要開始和結束标簽:
{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}
過濾器
過濾器轉換變量和标簽參數的值。它們看起來像這樣:
{{ django|title }}
使用 {'django': 'the web framework for perfectionists with deadlines'} 的上下文,此模闆呈現為:
The Web Framework For Perfectionists With Deadlines
一些過濾器接受一個參數:
{{ my_date|date:"Y-m-d" }}
使用模闆語言變量輸出動态内容到頁面
在模闆檔案 index.html 中輸入下列内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ title }}</h1>
<div>My first name is {{ first_name }}. My last name is {{ last_name }}.</div>
</body>
</html>
其中 title,first_name,last_name 都是變量。需要從 view 中傳遞變量的值過來。
那麼就需要對 polls/views.py 的 index() 進行修改。這裡就需要用到 render 對模闆進行資料渲染:
from django.shortcuts import render
#通過模闆語言的變量進行傳遞資訊
def index(request):
context = {'title':'我的站點' ,'first_name': '乙丙', 'last_name': '白'}
return render(request, 'index.html', context)
儲存之後。在浏覽器中通路:http://127.0.0.1:8000/polls/。可以看到如下界面内容: