關於django的模板層
你可能已經注意到我們在例子檢視中返回文字的方式有點特別。 也就是說,HTML被直接硬編碼在 Python程式碼之中。
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)來實現這種模式,這就是本章要具體討論的問題。
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]}
{{var_name}} #兩個花括號,括號裡面是變數名(和檢視函式中字典中的鍵值是一樣的)
views.py 檔案
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,"di c":dic,"date":date,"person_list":person_list})
template資料夾中的某個網頁,存有我們的檢視函式所要呼叫的玩網頁
<h4>{{s}}</h4> #花括號裡面的名字是和檢視函式中返回值中的字典中的鍵值對應的 <h4>列表:{{ l.0 }}</h4> #花括號中的0是指定取l列表中的第一個值 <h4>列表:{{ l.2 }}</h4> #花括號中的2是取l中的第三個數嵌入頁面中 <h4>字典:{{ dic.name }}</h4> #取檢視函式中檢視函式定義的字典中的鍵值為name鎖對應的值 <h4>日期:{{ date.year }}</h4> #取相應檢視函式中data中year的值 <h4>類物件列表:{{ person_list.0.name }}</h4> ##取相應的列表中的第一個值的名字
注意:句點符也可以用來引用物件的方法(無引數方法):
<h4>字典:{{ dic.name.upper }}<
/
h4>
模板值過濾器
語法:
{{object|filter_name:引數}}
#boject為要引用的物件(變數)
#filter_name為過濾器的名字
#param為引數
default
如果一個變數的值為false或者為空,則使用預設值,否則使用變數值
{{param|default:'nothing'}}
length
返回值的長度:他對字串和列表都適用
{{param|length}}
如:param是['a','b','c','d']則返回值是4;
param是'abcd'返回值也是4
filesizeformat
把檔案的大小轉化成我們可讀的一個尺寸形式:如'1KB','20MB','100bytes'
{{param|filesizeformat}}
如:102400009 則返回值為 1MB(近似等於不是精準的)
date
如:
param=datetime.datetime.now()
{{param|date:'Y-m-d'}} #從param中篩選出年月日
slice
切片:
如param='qwert'
{{param|silce:'2:-1'}} #返回值是'ert'
truncatechar
如果字串中字元數量多於指定數量,則擷取指定數量的字串顯示,並用三個...來代替被截斷的字元
{{param|truncatechar:引數}} #引數為你想要擷取的長度(包括三個點)
param='派生從入門到入土'
{{param|truncatechar:'6'}} #返回值為:派生從...
#注意,這邊...三個點點點要佔用三個字元
safe
Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個
內容管理系統,後臺新增的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加註了HTML修飾符的文字,如果自動轉義的話顯示的就是保護HTML標籤
的原始檔。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變數我們可以通過過濾器“|safe”的方式告訴Django這段程式碼是安全的不必轉義。
比如:
value='<p>我是p標籤<P>'
{{value|safe}} #告訴django這是一個安全的標籤,要轉化成標籤,如果沒用safe這個過濾器
#則是一個字串
這些是一些基本的過濾器.
模板之標籤
你可能已經注意到我們在例子檢視中返回文字的方式有點特別。 也就是說,HTML被直接硬編碼在 Python程式碼之中。
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)來實現這種模式,這就是本章要具體討論的問題。
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]}