模板
MTV,View(urls.py和views.py合併),Model(和數據庫打交道),Template(將從數據庫獲取的數據渲染到頁面),html
分層的目的是解耦python
模板的內容有:變量 經常使用標籤 過濾器 模板結構優化 靜態文件加載shell
詳解模板
模板查找路徑配置:數據庫
在項目的settings.py
文件中。有一個TEMPLATES
配置,這個配置包含了模板引擎的配置,模板查找路徑的配置,模板上下文的配置等。模板路徑能夠在兩個地方配置。django
-
DIRS
:這是一個列表,在這個列表中能夠存放全部的模板路徑,之後在視圖中使用render
或者render_to_string
渲染模板的時候,會在這個列表的路徑中查找模板。緩存 -
APP_DIRS
:默認爲True
,這個設置爲True
後,會在INSTALLED_APPS
的安裝了的APP
下的templates
文件加中查找模板。app -
查找順序:好比代碼
render('list.html')
。先會在DIRS
這個列表中依次查找路徑下有沒有這個模板,若是有,就返回。若是DIRS
列表中全部的路徑都沒有找到,那麼會先檢查當前這個視圖所處的app
是否已經安裝,若是已經安裝了,那麼就先在當前這個app
下的templates
文件夾中查找模板,若是沒有找到,那麼會在其餘已經安裝了的app
中查找。若是全部路徑下都沒有找到,那麼會拋出一個TemplateDoesNotExist
的異常函數
模板是html頁面裏面的特殊符號,能夠視爲佔位符,用來動態填充不一樣的數據,oop
有本身特殊的語法標記,須要記憶,記不住要知道怎麼查怎麼用。優化
變量相關用{{變量名}}
邏輯相關用{% %}
點(.)在模板語言裏有特殊含義,用來獲取對象屬性值,例如person.name,若是person是一個字典,name就是key;若是person是對象,name就是屬性或方法。既然能夠是方法或者屬性,必須注意person若是是字典對象,那麼key不能和他內置的方法名重複,一旦添加就會進行value覆蓋。
說白了DTL也是用python寫的。
若是person.1就會判斷是否是序列,例如列表,元組或其餘能夠用下標獲取數據的對象,若是都不是就返回一個空串。
DTL絕對不能出現[]和()。
DTL
是Django Template Language
是Django自帶的模板語言
DTL與普通的HTML文件的區別:DTL模板是一種帶有特殊語法的HTML文件,這個HTML文件能夠被Django編譯,能夠傳遞參數進去,實現數據動態化。在編譯完成後,生成一個普通的HTML文件,而後發送給客戶端。
經常使用標籤
全部的標籤都須要用標籤符號{% %}
進行包裹
1-if
標籤
{% if "張三" in persons %} <p>張三</p> {% else %} <p>李四</p> {% endif %}
2-for...in...標籤
{% for person in persons %} <p>{{ person.name }}</p> {% endfor %}
若是想要反向遍歷,那麼在遍歷的時候就加上一個reversed
{% for person in persons reversed %} <p>{{ person.name }}</p> {% endfor %}
遍歷字典的時候,須要使用items
、keys
和values
等方法。在DTL
中,執行一個方法不能使用圓括號的形式。遍歷字典示例代碼以下
{% for key,value in person.items %} <p>key:{{ key }}</p> <p>value:{{ value }}</p> {% endfor %}
在for
循環中,DTL
提供了一些變量可供使用。這些變量以下:
forloop.counter
:當前循環的下標。以1做爲起始值。forloop.counter0
:當前循環的下標。以0做爲起始值。forloop.revcounter
:當前循環的反向下標值。好比列表有5個元素,那麼第一次遍歷這個屬性是等於5,第二次是4,以此類推。而且是以1做爲最後一個元素的下標。forloop.revcounter0
:相似於forloop.revcounter。不一樣的是最後一個元素的下標是從0開始。forloop.first
:是不是第一次遍歷。forloop.last
:是不是最後一次遍歷。forloop.parentloop
:若是有多個循環嵌套,那麼這個屬性表明的是上一級的for循環。
3-for...in...empty
標籤
這個標籤使用跟for...in...
是同樣的,只不過是在遍歷的對象若是沒有元素的狀況下,會執行empty
中的內容。示例代碼以下
{% for person in persons %} <li>{{ person }}</li> {% empty %} 暫時尚未任何人 {% endfor %}
4-with
標籤:在模版中定義變量。有時候一個變量訪問的時候比較複雜,那麼能夠先把這個複雜的變量緩存到一個變量上,之後就能夠直接使用這個變量就能夠了。示例代碼以下
context = { "persons": ["張三","李四"] } {% with lisi=persons.1 %} <p>{{ lisi }}</p> {% endwith %}
有幾點須要強烈的注意:
- 在
with
語句中定義的變量,只能在{%with%}{%endwith%}
中使用,不能在這個標籤外面使用。 - 定義變量的時候,不能在等號左右兩邊留有空格。好比
{% with lisi = persons.1%}
是錯誤的。 - 還有另一種寫法一樣也是支持的:
{% with persons.1 as lisi %} <p>{{ lisi }}</p> {% endwith %}
5-url
標籤
在模版中,咱們常常要寫一些url
,好比某個a
標籤中須要定義href
屬性。固然若是經過硬編碼的方式直接將這個url
寫死在裏面也是能夠的。可是這樣對於之後項目維護可能不是一件好事。所以建議使用這種反轉的方式來實現,相似於django
中的reverse
同樣。示例代碼以下:
<a href="{% url 'book:list' %}">圖書列表頁面</a>
若是url
反轉的時候須要傳遞參數,那麼能夠在後面傳遞。可是參數分位置參數和關鍵字參數。位置參數和關鍵字參數不能同時使用。示例代碼以下
# path部分 path('detail/<book_id>/',views.book_detail,name='detail') # url反轉,使用位置參數 <a href="{% url 'book:detail' 1 %}">圖書詳情頁面</a> # url反轉,使用關鍵字參數 <a href="{% url 'book:detail' book_id=1 %}">圖書詳情頁面</a>
若是想要在使用url
標籤反轉的時候要傳遞查詢字符串的參數,那麼必需要手動在在後面添加。示例代碼以下:
<a href="{% url 'book:detail' book_id=1 %}?page=1">圖書詳情頁面</a>
若是須要傳遞多個參數,那麼經過空格的方式進行分隔。示例代碼以下:
<a href="{% url 'book:detail' book_id=1 page=2 %}">圖書詳情頁面</a>
渲染模板
django還提供了一個更加簡便的方式,直接將模板渲染成字符串和包裝成HttpResponse
對象一步到位完成。示例代碼以下:
from django.shortcuts import render def book_list(request): return render(request,'list.html')
這是渲染的沒有數據的模板,有數據的則用參數context傳入字典便可。字典的key是html中變量的名字,value是傳入的後臺數據的變量名,或者就傳真實數據,是實際渲染的數據。
fliter
除了內置的變量,邏輯表達式以外,Dtl裏面還有filter,本質就是函數,對後臺傳到模板裏面的數據進行再處理,例如字符串所有大寫。
既然是函數,那麼就有內置函數和自定義函數。
{{ value|add:"2" }}