模板介紹
- 作爲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")]
模板處理
- Django處理模板分爲兩個階段
- Step1 加載:根據給定的標識找到模板然後預處理,通常會將它編譯好放在內存中
loader.get_template(template_name),返回一個Template對象
- Step2 渲染:使用Context數據對模板插值並返回生成的字符串
Template對象的render(RequestContext)方法,使用context渲染模板
- 加載渲染完整代碼:
from django.template import loader, RequestContext
from django.http import HttpResponse
def 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 render
def index(request):
return render(request, 'temtest/index.html')
創建新項目:
修改配置:
數據庫:mysql
app註冊、test4目錄下新建模板文件夾,設置模板路徑
配置urls,跳到應用urls,在應用目錄下新建urls;
配置應用urls,跳到視圖函數views;
配置models,定義模型類,表名稱與數據庫test2的修改爲一致,
數據類型與數據庫test2表結構一致:如果沒有數據庫,需要migration生成遷移;
在models.py中定義類HeroInfo
打開views定義視圖調用models的函數;傳遞HeroInfo對象
在模板detail.html中調用index方法,
定義模板
- 模板語言包括
- 變量
- 標籤 { % 代碼塊 % }
- 過濾器
- 註釋{# 代碼或html #}
變量
- 語法:
{{ variable }}
- 當模版引擎遇到一個變量,將計算這個變量,然後將結果輸出
- 變量名必須由字母、數字、下劃線(不能以下劃線開頭)和點組成
- 當模版引擎遇到點("."),會按照下列順序查詢:
- 字典查詢,例如:foo["bar"]
- 屬性或方法查詢,例如:foo.bar
- 數字索引查詢,例如:foo[bar]
- 如果變量不存在, 模版系統將插入'' (空字符串)
- 在模板中調用方法時不能傳遞參數
在模板中調用對象的方法
- 在models.py中定義類HeroInfo
from django.db import models
class 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}}
標籤
- 語法:{ % tag % }
- 作用
- 在輸出中創建文本
- 控制循環或邏輯
- 加載外部信息到模板中供以後的變量使用
- for標籤
{ %for ... in ...%}
循環邏輯
{{forloop.counter}}表示當前是第幾次循環
{ %empty%}
給出的列表爲或列表不存在時,執行此處
{ %endfor%}
- if標籤
{ %if ...%}
邏輯1
{ %elif ...%}
邏輯2
{ %else%}
邏輯3
{ %endif%}
- comment標籤
{ % comment % }
多行註釋
{ % endcomment % }
- include:加載模板並以標籤內的參數渲染
{ %include "foo/bar.html" % }
- url:反向解析
{ % url 'name' p1 p2 %}
- csrf_token:這個標籤用於跨站請求僞造保護
{ % csrf_token %}
- 布爾標籤:and、or,and比or的優先級高
- block、extends:詳見“模板繼承”
- autoescape:詳見“HTML轉義”
過濾器
- 語法:{ { 變量|過濾器 }},例如{ { name|lower }},表示將變量name的值變爲小寫輸出
- 使用管道符號 (|)來應用過濾器
- 通過使用過濾器來改變變量的計算結果
- 可以在if標籤中使用過濾器結合運算符
if list1|length > 1
- 過濾器能夠被“串聯”,構成過濾器鏈
name|lower|upper
- 過濾器可以傳遞參數,參數使用引號包起來
list|join:", "
- default:如果一個變量沒有被提供,或者值爲false或空,則使用默認值,否則使用變量的值
value|default:"什麼也沒有"
- date:根據給定格式對一個date變量格式化
value|date:'Y-m-d'
- escape:詳見“HTML轉義”
- 點擊查看詳細的過濾器
註釋
- 單行註釋
{#...#}
- 註釋可以包含任何模版代碼,有效的或者無效的都可以
{# { % if foo % }bar{ % else % } #}
- 使用comment標籤註釋模版中的多行內容
示例
- 查詢所有英雄信息顯示出來,要求奇數行顯示爲紅色,偶數行顯示爲藍色
views過濾heroinfo,
過濾器,奇數行顯示爲紅色,偶數行顯示爲藍色
- url:反向解析
-
{ % url 'name' p1 p2 %}
總urls namespace booktest:
應用urls, show
booktest/(\d+)
兩個參數:
應用urls,兩個括號數字
views:兩個傳入參數,context接收兩個參數
index頁面,引號傳入,兩個參數
最終顯示頁面show.html,直接顯示兩組數字