1. 模板簡介
作為 Web 開發框架,Django 提供了模板,可以很便利的動態生成 HTML。模版系統致力于表達外觀,而不是程序邏輯。
模板的設計實現了業務邏輯(view)與顯示內容(template)的分離,一個視圖可以使用任意一個模板,一個模板可以供多個視圖使用。
模板包含:
- HTML的靜態內容
- 動態插入的內容(Django 模板語言,簡寫 DTL,定義在 django.template 包中)
由 startproject 命令生成的 settings.py 定義關于模板的值:
- DIRS 定義了一個目錄列表,模板引擎按列表順序搜索這些目錄以查找模板源文件。
- APP_DIRS 告訴模板引擎是否應該在每個已安裝的應用中查找模板。
方式一(常用方式):在項目的根目錄下創建 templates 目錄,配置 DIRS 值。
DIRS = [os.path.join(BASE_DIR,"templates")]
方式二:在應用的目錄下創建 templates 目錄,則無需配置 DIRS 值,程序會自動在該目錄下尋找模板。
模板處理
Django 處理模板分為兩個階段:
- Step1 加載:根據給定的標識找到模板然后預處理,通常會將它編譯好放在內存中
loader.get_template(template_name) # 返回一個Template對象
- Step2 渲染:使用Context數據對模板插值并返回生成的字符串
Template對象的render(RequestContext)方法,使用context渲染模板
- 加載渲染完整代碼:
from django.template import loader, RequestContext
from django.http import HttpResponsedef index(request):tem = loader.get_template('temtest/index.html')context = RequestContext(request, {})return HttpResponse(tem.render(context))
快捷函數
為了減少加載模板、渲染模板的重復代碼,Django 提供了快捷函數:
- render_to_string("")
- render(request, '模板', context)
from django.shortcuts import renderdef index(request):return render(request, 'temtest/index.html')
2. 模板語言 DTL
模板語言包括:
- 變量 {{ 變量名 }}
- 標簽 { % 代碼塊 % }
- 過濾器
- 注釋 {# 代碼或html #}
變量
語法:
{{ variable }}
- 當模版引擎遇到一個變量,將計算這個變量,然后將結果輸出。
- 變量名只能由字母、數字、下劃線(不能以下劃線開頭)和點組成。
- 當模版引擎遇到點("."),會按照下列順序查詢:
- 字典查詢,例如:foo["bar"]
- 屬性或方法查詢,例如:foo.bar
- 數字索引查詢,例如:foo[bar]
- 如果變量不存在, 模版系統將插入空字符串。
- 在模板中調用方法時不能傳遞參數。
范例:在模板中調用對象的方法
- 在 models.py 中定義類 HeroInfo 類:
from django.db import modelsclass HeroInfo(models.Model):...def showName(self):return self.hname
- 在 views.py 中傳遞 HeroInfo 對象:
from django.shortcuts import render
from models import *def index(request):hero = HeroInfo(hname='abc')context = {'hero': hero}return render(request, 'temtest/detail.html', context)
- 在模板 detail.html 中調用對象的方法:
{{hero.showName}}
標簽
語法:
{% 代碼塊 %}
作用:
- 在輸出中創建文本
- 控制循環或邏輯
- 加載外部信息到模板,供以后的變量使用
for 標簽
語法:
{% for ... in ... %}
# 循環體中的邏輯
{{forloop.counter}} # 表示當前是第幾次循環(從1開始)
{% empty %}
# 給出的列表為空或列表不存在時,執行此處。類似于 else
{% endfor %} # for 循環的結束標識
示例:
<body>
{% for hero_obj in hero %}{{ forloop.counter }}: {{hero_obj.show}}<br/>
{% empty %}<h2>啥也沒找到...</h2>
{% endfor %}
</body>1: 郭靖
2: 黃蓉
3: 比伯
4: 王嘉爾
5: 歐陽鋒
if 標簽
語法&#