1. 程式人生 > >關於django的模板層

關於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]}
複製程式碼