Django之模板

模板

MTV,View(urls.py和views.py合併),Model(和數據庫打交道),Template(將從數據庫獲取的數據渲染到頁面),html

分層的目的是解耦python

模板的內容有:變量  經常使用標籤 過濾器  模板結構優化  靜態文件加載shell

詳解模板

模板查找路徑配置:數據庫

在項目的settings.py文件中。有一個TEMPLATES配置,這個配置包含了模板引擎的配置,模板查找路徑的配置,模板上下文的配置等。模板路徑能夠在兩個地方配置。django

  1. DIRS:這是一個列表,在這個列表中能夠存放全部的模板路徑,之後在視圖中使用render或者render_to_string渲染模板的時候,會在這個列表的路徑中查找模板。緩存

  2. APP_DIRS:默認爲True,這個設置爲True後,會在INSTALLED_APPS的安裝了的APP下的templates文件加中查找模板。app

  3. 查找順序:好比代碼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絕對不能出現[]和()。

DTLDjango 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 %}

  遍歷字典的時候,須要使用itemskeysvalues等方法。在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" }}
相關文章
相關標籤/搜索