django框架模板語言使用方法詳解
本文實(shí)例講述了django框架模板語言使用方法。分享給大家供大家參考,具體如下:
模板功能
作用:生成html界面內(nèi)容,模版致力于界面如何顯示,而不是程序邏輯。模板不僅僅是一個(gè)html文件,還包括了頁面中的模板語言。
- 靜態(tài)內(nèi)容:css,js,html。
- 動(dòng)態(tài)內(nèi)容:通過模板語言,動(dòng)態(tài)生成一些網(wǎng)頁內(nèi)容
模板使用: 在視圖函數(shù)中,使用模板產(chǎn)生html內(nèi)容返回給客戶端
方式一:
- 加載模板文件(loader.get_template)
- 模板渲染,產(chǎn)生標(biāo)準(zhǔn)的html頁面內(nèi)容(render)
通過HttpResponse對(duì)象,返回html界面內(nèi)容給瀏覽器
def index(request):
"""進(jìn)入首頁"""
context = {} # 字典
# 獲取模板對(duì)象
template = loader.get_template('index.html')
# 渲染模板, 得到標(biāo)準(zhǔn)的html內(nèi)容
html_str = template.render(context, request)
# 響應(yīng)請(qǐng)求,返回html界面
return HttpResponse(html_str)
方式二:
通過render()函數(shù)
def index(request):
"""進(jìn)入首頁"""
context = {} # 字典
return render(request, 'index.html', context)
模板加載流程
Django會(huì)依次到以下目錄查找模板文件,如果都找不到,則報(bào)錯(cuò):
- 項(xiàng)目配置的模板目錄
- admin應(yīng)用的templates模板目錄
- auth應(yīng)用的templates模板目錄
應(yīng)用本身的templates模板目錄
模板語言
DTL.(Django Template Language)簡稱: 模板語言
模板變量
格式: {{ 變量名 }}
模板變量名: 是由數(shù)字,字母,下劃線組成,不能以下劃線開頭。
點(diǎn)(.) 也在會(huì)變量部分中出現(xiàn), 點(diǎn)號(hào)(.)用來訪問變量的屬性。
當(dāng)模版系統(tǒng)遇到點(diǎn)("."),它將以這樣的順序查詢:
- 字典查詢(Dictionary lookup)
- 屬性或方法查詢(Attribute or method lookup) (調(diào)用方法時(shí)不能傳參)
- 數(shù)字索引查詢(Numeric index lookup)
如果模板變量不存在,則生成html內(nèi)容時(shí)用 '' 空字符串代替。
例如: {{ book.btitle }}
1) 首先把book當(dāng)成一個(gè)字典,把btitle當(dāng)成鍵名,進(jìn)行取值book['btitle']
2) 把book當(dāng)成一個(gè)對(duì)象,把btitle當(dāng)成屬性或方法,進(jìn)行取值
例如:{{ book.0 }}
1) 首先把book當(dāng)成一個(gè)字典,把0當(dāng)成鍵名,進(jìn)行取值book['0']
2) 把book當(dāng)成一個(gè)列表,把0當(dāng)成下標(biāo),進(jìn)行取值book[0]
模板標(biāo)簽
代碼段
{% 代碼段 %}
for 循環(huán)
遍歷列表:
{% for x in 列表 %}
列表不為空時(shí)執(zhí)行
{% empty %}
列表為空時(shí)執(zhí)行
{% endfor %}
若加上關(guān)鍵字reversed則倒序遍歷:
{% for x in 列表 reversed %}
{% endfor %}
遍歷字典:
{% for key, value in my_dict.items %}
{{ key }}: {{ value }}
{% endfor %}
可以通過 {{ forloop.counter }} 判斷for循環(huán)執(zhí)行到第幾次,初始化值從1開始。

if 語句
{% if 條件 %}
{% elif 條件 %}
{% else %}
{% endif %}
關(guān)系比較操作符:
> < >= <= == !=
注意:進(jìn)行比較操作時(shí),比較操作符兩邊必須有空格。
邏輯運(yùn)算:
not and or
過濾器
過濾器: 用于對(duì)模板變量進(jìn)行操作,使用格式:
模板變量|過濾器:參數(shù)
一、內(nèi)置過濾器
date: 改變?nèi)掌诘娘@示格式。
value|date:"Y年m月j日 H時(shí)i分s秒"
length: 求長度。字符串,列表,元組,字典長度
default: 設(shè)置模板變量的默認(rèn)值。
data|default:'默認(rèn)值'
二、自定義過濾器
需求: 實(shí)現(xiàn)兩個(gè)自定義過濾器:
(1)判斷是否奇偶
(2)求余操作
實(shí)現(xiàn)步驟:
- 創(chuàng)建包: 在應(yīng)用下創(chuàng)建名字為templatetags的python包(名字固定)
- 創(chuàng)建模塊: 在該templatetags下創(chuàng)建filters.py(名字隨意取),該名字后面會(huì)使用到。
定義函數(shù) 自定義過濾器即帶有一個(gè)或兩個(gè)參數(shù)的python函數(shù):
- 參數(shù)1:模板變量
- 參數(shù)2:參數(shù),可選
裝飾函數(shù)
- 定義一個(gè)名字叫 register 的Library對(duì)象(名字固定)
- 使用 @register.filter 對(duì)過濾器函數(shù)進(jìn)行裝飾
在模板界面中加載過濾器并使用: 在html中, 通過load標(biāo)簽導(dǎo)入自定義過濾器, 并使用:
模板注釋
單行注釋:
{# 注釋內(nèi)容 #}
多行注釋:
{% comment %}
注釋內(nèi)容
{% endcomment %}
模板繼承
模板繼承: 為了重用html頁面內(nèi)容
使用格式: {% extends 父模板文件路徑 %}
塊的使用:
在父模板里可以定義塊:
{% block 塊名 %}
塊中的內(nèi)容(也可以沒有)
{% endblock 塊名%}
在子模板頭部聲明繼承父模板:
{% extends 父模板文件路徑 %}
示例:
{% extends "app01/parent.html" %}
在子模板中,重寫父模板中的塊(也可以不重寫):
{% block 塊名 %}
{{ block.super}} #獲取父模板中塊的默認(rèn)內(nèi)容
重寫的內(nèi)容
{% endblock 塊名%}
Django中html轉(zhuǎn)義
通過視圖函數(shù)(render函數(shù))傳給模板的數(shù)據(jù),如果含有特殊字符,默認(rèn)是會(huì)轉(zhuǎn)義的。
要關(guān)閉模板上下文字符串的轉(zhuǎn)義:可以使用
{{ 模板變量|safe}}
也可以使用:
{% autoescape off %}
模板語言代碼
{% endautoescape %}
模板硬編碼中的字符串默認(rèn)不會(huì)轉(zhuǎn)義,如果需要轉(zhuǎn)義,那需要手動(dòng)進(jìn)行轉(zhuǎn)義。

url反向解析
url逆向解析,反向解析
需求:當(dāng)urls.py中的一個(gè)url配置項(xiàng)發(fā)生改變后,項(xiàng)目中所有硬編碼引用該url鏈接的地方,都需要作修改。
解決方法:
給url配置項(xiàng)起個(gè)名字,在html界面中,再通過名字引用該url:
# project下的urls.py
urlpatterns = [
...
url(r'^', include('app01.urls', namespace='應(yīng)用名')),
]
# app01下的urls.py
urlpatterns = [
...
url(r'^index$', views.index, name='url名稱'),
]
在html界面中,通過url標(biāo)簽進(jìn)行動(dòng)態(tài)引用
{% url '應(yīng)用名:url名稱' %}
{% url '應(yīng)用名:url名稱' 位置參數(shù)1 位置參數(shù)2 %}
{% url '應(yīng)用名:url名稱' 關(guān)鍵字參數(shù)1 關(guān)鍵字參數(shù)2 %}
參考:
{% url 'app01:index' %}
{% url 'app01:show_news' 1 2 %}
{% url 'app01:show_news2' category=1 pageNo=2 %}
reverse函數(shù)
問題: 類似的,在python代碼中,同樣存在上面所說的url硬編碼不方便維護(hù)的問題
# views.py
def url_reverse(request):
# url正則配置項(xiàng)修改后,此處url硬編碼代碼需要修改
return redirect("/index")
# return redirect("/show_news/1/2")
# return redirect("/show_news2/1/2")
解決:使用reverse函數(shù),動(dòng)態(tài)生成url。
# views.py
def url_reverse(request):
# 動(dòng)態(tài)引用
# url = reverse("應(yīng)用名:url名稱")
# url = reverse("應(yīng)用名:url名稱", args=[位置參數(shù)])
# url = reverse("應(yīng)用名:url名稱", kwargs={關(guān)鍵字參數(shù)})
return redirect(url)
希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python PyWebIO提升團(tuán)隊(duì)效率使用介紹
這篇文章主要為大家介紹了Python PyWebIO提升團(tuán)隊(duì)效率使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Python實(shí)現(xiàn)簡單登錄驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡單登錄驗(yàn)證的相關(guān)資料,需要的朋友可以參考下2016-04-04
Django中g(shù)et()和filter()返回值區(qū)別詳解
在django中,我們查詢經(jīng)常用的兩個(gè)API中,會(huì)經(jīng)常用到get()和filter()兩個(gè)方法,兩者的區(qū)別是什么呢?本文就一起來了解一下2021-05-05
基于Python實(shí)現(xiàn)文件的壓縮與解壓縮
在日常工作中,除了會(huì)涉及到使用Python處理文本文件,有時(shí)候還會(huì)涉及對(duì)壓縮文件的處理。本文為大家總結(jié)了利用Python可以實(shí)現(xiàn)的幾種文件壓縮與解壓縮實(shí)現(xiàn)代碼,需要的可以參考一下2022-03-03
使用apidoc管理RESTful風(fēng)格Flask項(xiàng)目接口文檔方法
下面小編就為大家分享一篇使用apidoc管理RESTful風(fēng)格Flask項(xiàng)目接口文檔方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
python獲取代碼運(yùn)行時(shí)間的實(shí)例代碼
今天小編就為大家分享一篇python獲取代碼運(yùn)行時(shí)間的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
python設(shè)置檢查點(diǎn)簡單實(shí)現(xiàn)代碼
這篇文章主要介紹了python設(shè)置檢查點(diǎn)簡單實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-07-07
Python3與fastdfs分布式文件系統(tǒng)如何實(shí)現(xiàn)交互
這篇文章主要介紹了Python3與fastdfs分布式文件系統(tǒng)如何實(shí)現(xiàn)交互,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
利用Tensorflow的隊(duì)列多線程讀取數(shù)據(jù)方式
今天小編就為大家分享一篇利用Tensorflow的隊(duì)列多線程讀取數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02

