使用Django 的Templates系統(tǒng)铸董,不僅實(shí)現(xiàn)了前后端分離窟感、動(dòng)態(tài)生成html门烂;而且可以實(shí)現(xiàn)模板繼承,減少重復(fù)代碼等
前言
?? Django 項(xiàng)目可以配置0個(gè)逛球、一個(gè)或者多個(gè)模板引擎千元,當(dāng)執(zhí)行startproject
命令創(chuàng)建項(xiàng)目時(shí),會(huì)在settings.py
文件中自動(dòng)配置默認(rèn)使用一個(gè)模板引擎需忿,如下
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': (os.path.join(BASE_DIR, 'templates'),#自定義路徑
),#更推薦使用元組诅炉,因?yàn)椴豢尚薷? 'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
?? BACKEND字段:實(shí)現(xiàn)Django后端API的模板引擎類,內(nèi)置有:django.template.backends.django.DjangoTemplates
和 django.template.backends.jinja2.Jinja2
?? DIRS字段:定義引擎應(yīng)按搜索順序查找模板源文件的目錄列表屋厘,如上:搜索項(xiàng)目下的templates目錄
?? APP_DIRS字段:告訴引擎是否應(yīng)該在已安裝的應(yīng)用程序中查找模板涕烧,如上,設(shè)置為True汗洒,搜索各應(yīng)用(app)下的templates目錄议纯。通常情況下,一個(gè)項(xiàng)目有多個(gè)app應(yīng)用溢谤,為了分類管理及避免同文件使用錯(cuò)誤瞻凤,在app下創(chuàng)建templates目錄結(jié)構(gòu)為:app/templates/app/**.html
憨攒,app
這里的需要替換成具體的名稱,視圖中引用模板阀参,使用相對(duì)templates目錄的路徑肝集,即app/**.html
?? OPTIONS字段:特定后端的配置
根據(jù)上述配置,設(shè)置了APP_DIRS=True
蛛壳,模板引擎搜索templates順序?yàn)椋篋IRS > 當(dāng)前項(xiàng)目安裝app的templates目錄 > 其他已安裝app的templates目錄杏瞻,找到就停止搜索,找不到就拋出異常
由于歷史原因衙荐,模板引擎的通用支持和Django模板語(yǔ)言的實(shí)現(xiàn)都存在于django.template 命名空間中
django.template.loader
模塊定義了兩個(gè)用于加載模板的函數(shù)
?? get_template(template_name捞挥,using = None)
返回一個(gè) Template對(duì)象,找不到模板時(shí)會(huì)拋出django.template.TemplateDoesNotExist
異常
?? select_template(template_name_list忧吟,using = None)
根據(jù)模板名稱列表砌函。按順序查找每個(gè)名稱并返回存在的第一個(gè)Template對(duì)象
通過(guò)get_template()或select_template()返回Template對(duì)象,為對(duì)象提供了一個(gè)render()方法
?? Template.render(context=None, request=None)
?? ?? context 模板上下文溜族,為模板傳遞參數(shù)讹俊,字典類型
?? ?? request,HttpRequest
類型斩祭,與引擎后端有關(guān)
render_to_string(template_name劣像,context = None,request = None摧玫,using = None)
加載模板【get_template()或select_template()】和渲染【Template.render】,這是一個(gè)減少加載和渲染模板的重復(fù)性绑青,django.template 提供的一個(gè)快捷方法
以上簡(jiǎn)單說(shuō)明了模板引擎內(nèi)部方法诬像,真正使用時(shí),可直接使用Django 提供的快捷方法django.shortcuts.render
,無(wú)需重復(fù)造輪子
除了使用內(nèi)置引擎闸婴,也可以自定義引擎坏挠,這里不做展開(kāi)
模板語(yǔ)言DTL(Django Templates Language)
變量
??使用{{var}}
,若不存在,插入空字符
字典
模板中使用字典邪乍,與python語(yǔ)言使用有點(diǎn)區(qū)別
??獲取鍵值對(duì){{dicts.items}}
??獲取值dicts.key #指定具體key
對(duì)象
??獲取對(duì)象值obj.attr
列表
??獲取索引值mylist.0