1. 程式人生 > >Django——模板層(template)(模板語法、自定義模板過濾器及標簽、模板繼承)

Django——模板層(template)(模板語法、自定義模板過濾器及標簽、模板繼承)

num 序列 document 希望 可讀性 數量 AC 自然 同學

前言:當我們想在頁面上給客戶端返回一個當前時間,一些初學者可能會很自然的想到用占位符,字符串拼接來達到我們想要的效果,但是這樣做會有一個問題,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“Joela,輸出將為“Joe...”

safe

Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,後臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加註了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。比如:

1 value="<a href="">點擊</a>"
1 {{ value|safe}}

這裏簡單介紹一些常用的模板的過濾器,更多詳見

回到頂部(go to top)

模板之標簽