Django——模板層(template)(模板語法、自定義模板過濾器及標簽、模板繼承)
前言:當我們想在頁面上給客戶端返回一個當前時間,一些初學者可能會很自然的想到用占位符,字符串拼接來達到我們想要的效果,但是這樣做會有一個問題,HTML被直接硬編碼在 Python代碼之中。
1 2 3 4 |
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html) |
盡管這種技術便於解釋視圖是如何工作的,但直接將HTML硬編碼到你的視圖裏卻並不是一個好主意。 讓我們來看一下為什麽:
-
對頁面設計進行的任何改變都必須對 Python 代碼進行相應的修改。 站點設計的修改往往比底層 Python 代碼的修改要頻繁得多,因此如果可以在不進行 Python 代碼修改的情況下變更設計,那將會方便得多。
-
Python 代碼編寫和 HTML 設計是兩項不同的工作,大多數專業的網站開發環境都將他們分配給不同的人員(甚至不同部門)來完成。 設計者和HTML/CSS的編碼人員不應該被要求去編輯Python的代碼來完成他們的工作。
-
程序員編寫 Python代碼和設計人員制作模板兩項工作同時進行的效率是最高的,遠勝於讓一個人等待另一個人完成對某個既包含 Python又包含 HTML 的文件的編輯工作。
基於這些原因,將頁面的設計和Python的代碼分離開會更幹凈簡潔更容易維護。 我們可以使用 Django的 模板系統 (Template System)來實現這種模式,這就是本章要具體討論的問題。
python的模板:HTML代碼+模板語法
模版包括在使用時會被值替換掉的 變量,和控制模版邏輯的 標簽。
def current_time(req): # ================================原始的視圖函數# import datetime # now=datetime.datetime.now() # html="<html><body>現在時刻:<h1>%s.</h1></body></html>" %now # ================================django模板修改的視圖函數 # from django.template import Template,Context # now=datetime.datetime.now() # t=Template(‘<html><body>現在時刻是:<h1>{{current_date}}</h1></body></html>‘) # #t=get_template(‘current_datetime.html‘) # c=Context({‘current_date‘:str(now)}) # html=t.render(c) # # return HttpResponse(html) #另一種寫法(推薦) import datetime now=datetime.datetime.now() return render(req, ‘current_datetime.html‘, {‘current_date‘:str(now)[:19]})
回到頂部(go to top)
模板語法之變量
在 Django 模板中遍歷復雜數據結構的關鍵是句點字符 .
語法:
語法:
1 |
{{var_name}}
|
views:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def index(request):
import datetime
s = "hello"
l = [ 111 , 222 , 333 ] # 列表
dic = { "name" : "yuan" , "age" : 18 } # 字典
date = datetime.date( 1993 , 5 , 2 ) # 日期對象
class Person( object ):
def __init__( self ,name):
self .name = name
person_yuan = Person( "yuan" ) # 自定義類對象
person_egon = Person( "egon" )
person_alex = Person( "alex" )
person_list = [person_yuan,person_egon,person_alex]
return render(request, "index.html" ,{ "l" :l, "dic" :dic, "date" :date, "person_list" :person_list})
# return render(request,"index.html",locals())
|
template:
1 2 3 4 5 6 |
<h4>{{s}}< / h4>
<h4>列表:{{ l. 0 }}< / h4>
<h4>列表:{{ l. 2 }}< / h4>
<h4>字典:{{ dic.name }}< / h4>
<h4>日期:{{ date.year }}< / h4>
<h4>類對象列表:{{ person_list. 0.name }}< / h4>
|
註意:句點符也可以用來引用對象的方法(無參數方法)。
1 |
<h4>字典:{{ dic.name.upper }}< / h4>
|
模板之過濾器
語法:
1 |
{{obj|filter__name:param}}
|
default
如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值。例如:
1 |
{{ value|default: "nothing" }}
|
length
返回值的長度。它對字符串和列表都起作用。例如:
1 |
{{ value|length }}
|
如果 value 是 [‘a‘, ‘b‘, ‘c‘, ‘d‘],那麽輸出是 4。
filesizeformat
將值格式化為一個 “人類可讀的” 文件尺寸 (例如‘13 KB’,‘4.1 MB’,‘102 bytes’, 等等)。例如:
1 |
{{ value|filesizeformat }}
|
如果 value
是 123456789,輸出將會是 117.7 MB
。
date
如果 value=datetime.datetime.now(),將返回當前時間的年-月-日格式
1 |
{{ value|date: "Y-m-d" }}
|
slice
如果 value="hello world",則結果為ello worl (也是顧頭不顧尾)
1 |
{{ value| slice : "2:-1" }}
|
truncatechars
如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。(truncatewords則是按單詞數目截斷(單詞與單詞間按空格算),用法相同)
參數:要截斷的字符數
例如:
1 |
{{ value|truncatechars: 3 }}
|
如果value是“Joel是a,輸出將為“Joe...”。
safe
Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,後臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加註了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。比如:
1 |
value = "<a href=" ">點擊</a>"
|
1 |
{{ value|safe}}
|
這裏簡單介紹一些常用的模板的過濾器,更多詳見
回到頂部(go to top)