-
作爲Web框架,Django提供了模板,用於編寫html代碼,還可以嵌入模板代碼更快更方便的完成頁面開發,再通過在視圖中渲染模板,將生成最終的html字符串返回給客戶端瀏覽器
-
模板致力於表達外觀,而不是程序邏輯
-
模板的設計實現了業務邏輯
view
與顯示內容template
的分離,一個視圖可以使用任意一個模板,一個模板可以供多個視圖使用 -
模板包含兩部分:
靜態部分,包含html、css、js
動態部分,就是模板語言
-
Django處理模板分爲兩個階段:
加載:根據給定的路徑找到模板文件,編譯後放在內存中。
渲染:使用上下文數據對模板插值並返回生成的字符串。 -
爲減少重複編寫加載、渲染的代碼,Django提供了簡寫函數
render()
,用於調用模板。
Django模板語言(DTL)
- 定義在
django.template
包中 - 模板語言包括4種類型,分別是:
模板變量、模板標籤、模板過濾器、模板註釋
模板變量
模板變量的用來顯示從服務端傳遞過來的數據
-
語法格式:
HTML頁面:{{ 變量名 }}
視圖處理函數:return render(request, 'HTML頁面', 字典數據)
-
變量名,使用字典數據中的鍵作爲變量名
-
獲取不同類型的數據
數字類型:{{ 變量名 }}
字符串類型:{{ 變量名 }}
列表類型:{{ 變量名.下標 }}
字典類型:{{ 變量名.鍵 }}
對象類型:{{ 變量名.屬性 }}
-
如果變量不存在時,顯爲空字符串
-
在模板中可以調用方法,但不能傳遞參數
實例演練: 將字典值傳遞給頁面
- 修改urls.py文件:
url(r'^temp_var/$', views.temp_var),
- 修改views.py文件:
def temp_var(request):
dict = {'title': '字典鍵值'}
book = BookInfo()
book.btitle = '對象屬性'
context = {'dict': dict, 'book': book}
return render(request, 'app/temp_var.html', context)
- 在
templates/app
目錄中添加頁面文件temp_var.html
<body>
模板變量:<br/>
{{ dict.title }}<br/>
{{ book.btitle }}<br/>
</body>
- 在瀏覽器中查看結果
課堂練習:
- 創建一個查詢頁面
searchbook.html
,用來輸入圖書的名字 - 將對應的圖書信息顯示在
bookinfo.html
頁面上 - 假設查詢到的圖書只有一本
- searchbook.html
<body>
<form action="/app/dosearchbook/", method="post">
請輸入書名:<input type="text" name="bookname">
<br>
<input type="submit">
</form>
</body>
- bookinfo.html
<body>
書名:{{ book.btitle }} <br>
出版日期:{{ book.bpub_date }} <br>
閱讀數:{{ book.bread }} <br>
</body>
- searchbook
def searchbook(request):
return render(request, 'app/searchbook.html')
- dosearchbook
def dosearchbook(request):
bookname = request.POST.get('bookname') # 用戶輸入的書名
book = BookInfo.bookm.get(btitle=bookname) # 根據用戶輸入的書名查詢DB,得到圖書對象
content = {
'book': book,
}
return render(request, 'app/bookinfo.html', content)
- urls
url(r'^searchbook/$', views.searchbook),
url(r'^dosearchbook/$', views.dosearchbook)
模板標籤
語法格式:{% 代碼段 %}
for
標籤語法格式:
{% for item in 列表 %}
循環邏輯
{{ forloop.counter }}表示當前是第幾次循環,從1開始
{% empty %}
列表爲空或不存在時執行此邏輯
{% endfor %}
if
標籤語法格式:
{% if 條件1 %}
邏輯1
{% elif 條件2 %}
邏輯2
{% else %}
邏輯3
{% endif %}
-
比較運算符:
==
、!=
、<
、>
、<=
、>=
注意: 運算符左右兩側不能緊挨變量或常量,必須有空格。 -
邏輯運算符:
and
、or
、not
實例演練: 在頁面上顯示圖書列表
- 修改urls.py文件:
url(r'^temp_book/$', views.temp_book),
- 修改views.py文件:
def temp_book(request):
context = {'list': BookInfo.objects.all()}
return render(request, 'app/temp_book.html', context)
- 在
templates/app
目錄中添加頁面文件temp_book.html
<body>
圖書列表如下:
<ul>
{% for book in list %}
{% if book.id <= 2 %}
<li style="color: red;">{{ book.btitle }}</li>
{% elif book.id <= 3 %}
<li style="color: blue;">{{ book.btitle }}</li>
{% else %}
<li style="color: green;">{{ book.btitle }}</li>
{% endif %}
{% empty %}
<li>對不起,沒有圖書</li>
{% endfor %}
</ul>
</body>
- 在瀏覽器中查看結果
模板過濾器
使用過濾器對變量進行計算、格式轉換等操作
-
語法格式:
變量|過濾器:參數
-
常用過濾器:
length
,返回字符串包含字符的個數,或列表、元組、字典的元素個數。default
,如果變量不存在時則返回默認值。date
,用於對日期類型的值進行字符串格式化,常用的格式化字符如下:
Y表示年,格式爲4位,y表示兩位的年。
m表示月,格式爲01,02,12等。
d表示日, 格式爲01,02等。
j表示日,格式爲1,2等。
H表示時,24進制,h表示12進制的時。
i表示分,爲0-59。
s表示秒,爲0-59。
實例演練: 對書名大於4個字符的圖書,格式化其出版時間
- 修改urls.py文件:
url(r'^temp_filter/$', views.temp_filter),
- 修改views.py文件:
def temp_filter(request):
context = {'list': BookInfo.objects.all()}
return render(request, 'app/temp_filter.html', context)
- 在
templates/app
目錄中添加頁面文件temp_filter.html
<body>
圖書列表如下:
<ul>
{% for book in list %}
{% if book.btitle|length > 4 %}
<li style="color: red;">
{{ book.btitle }}
---默認時間格式爲:
{{ book.bpub_date }}
</li>
{% else %}
<li style="color: green;">
{{ book.btitle }}
---格式化時間爲:
{{ book.bpub_date|date:"Y-m-j" }}
</li>
{% endif %}
{% endfor %}
</ul>
</body>
- 在瀏覽器中查看結果
模板註釋
- 在模板中使用如下模板註釋,這段代碼不會被編譯,不會輸出到客戶端
- html註釋只能註釋html內容,不能註釋模板語言。
- 單行註釋語法格式:
{#...#}
,註釋可以包含任何模版代碼,有效的或者無效的都可以。 - 多行註釋使用
comment
標籤,語法格式:{%comment%}
...
{%endcomment%}