Django基礎之template
1. 模板系統的介紹
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
在這個例子檢視中返回文字的方式有點特別,HTML直硬編碼在Python程式碼之中。
儘管這種技術便於解釋檢視是如何工作的,但直接將HTML硬編碼到你的視圖裡卻不是一個好方法。原因如下:
對頁面設計進行的任何改變都必須對Python程式碼進行相應的修改。站點設計的修改往往比底層Python程式碼的修改要頻繁得多,因此,如果可以在不進行Python程式碼修改的情況下變更設計,那將會方便的多。
Python程式碼編寫和HTML設計是兩項不同的工作。大多數專業的網站開發環境都將它們分配給不同的人員(甚至不同的部門)來完成。設計者和HTML/CSS的編碼人員不應該被要求去編輯Python的程式碼來完成他們的工作。
程式編寫Python程式碼和設計人員製作模板兩項工作同時進行的效率是最高的,遠勝於讓一個人等待另一個人完成對某個既包含Python又包含HTML的檔案的編輯工作。
基於這些原因,將頁面的設計和Python程式碼分離開來,會更乾淨簡潔容易維護。我們可以使用Django的模板系統(Template System)來實現這種模式。
Pyhton的模板:HTML程式碼 + 邏輯控制程式碼。
2. 模板支援的語法
2.1 變數(使用雙打括號來引用變數)
語法格式如下:
{{ var_name }}
======================Template和Context物件========================= >>>python manange.py shell #進入該django專案的環境 >>>from django.template import Context, Template >>>t = Template("My name is {{name}}.") >>>c = Context({"name": "Stephane"}) >>>t.render(c)
執行結果為:
"My name is Stephane."
同一模板,多個上下文,一旦有了模板物件,就可以通過它渲染多個context,無論何時我們都可以像這樣使用同一模板渲染多個context。
只進行一次模板建立,然後多次呼叫render()方法渲染會更為搞笑。
不好的程式碼:
>>>for name in ("John", "Julie", "Pat"):
>>> t = Template("Hello {{ name }}")
>>> print(t.rander(Context({"name": name}>>>)))
>>>
好的程式碼是這樣寫的:
>>>t = Template("Hello, {{ name }}")
>>>for name in ("John", "Julie", "Pat"):
>>> print(t.rander(Context({"name": name})))
Django模板解析非常快捷。大部分的解析工作都是在後臺通過對簡短正則表示式一次性呼叫來完成。這和基於XML的模板引擎形成鮮明對比,那些引擎承擔了XML解析器的開銷,且往往比Django模板渲染引擎要慢上幾個數量級。
from django.shortcuts import render,HttpResponse
from django.template.loader import get_template #記得匯入
# Create your views here.
import datetime
from django.template import Template,Context
# def current_time(req):
#原始的檢視函式
# now=datetime.datetime.now()
# html="<html><body>現在時刻:<h1>%s.</h1></body></html>" %now
# return HttpResponse(html)
# def current_time(req):
#django模板修改的檢視函式
# now=datetime.datetime.now()
# t=Template('<html><body>現在時刻是:<h1 style="color:red">{{current_date}}</h1></body></html>')
#t=get_template('current_datetime.html')
# c=Context({'current_date':now})
# html=t.render(c)
# return HttpResponse(html)
#另一種寫法(推薦)
def current_time(req):
now=datetime.datetime.now()
return render(req, 'current_datetime.html', {'current_date':now})
2.2 深度變數的查詢(萬能的句點號)
在到目前為止的例子中,我們通過context傳遞的簡單引數值主要是字串,然而模板系統能夠非常簡潔地處理更加複雜的資料結構,例如list, dictionary和自定義的物件。在Django模板中遍歷複雜資料結構的關鍵是句點字元(.)。
2.2.1 句點可用於訪問列表索引
from django.template import Template, Context
t = Template("Item 2 is {{ item.2}}")
c = Context({"items": ["apples", "bananas", "carrots"]})
t.render(c)
執行結果為:
Item 2 is carrots.
2.2.2 向模板傳遞一個Python字典,通過字典鍵訪問該字典的值
>>>from django.template import Template, Context
>>>person = {"name": "Sally", "age": "43"}
>>>t = Template("{{person.name}} is {{person.age}} years old")
>>>c = Context({"person": person})
>>>t.render(c)
執行結果為:
Sally is 43 years old.
2.2.3 通過句點來訪問物件的屬性
比如說,Python中的datetime.date物件有year,month和day幾個屬性,那麼可以在模板中使用句點來訪問這些屬性。
>>>from django.template import Template, Context
>>>import datetime
>>>d = datetime.date(1993, 5, 2)
>>>t = Template("the month is {{ date.monte}} and the year is {{ date.year }}.")
>>>c = Context("date": d)
>>>t.render(c)
執行結果為:
>>>The month is 5 and the year is 1993.
2.2.4 編寫自定義的類,通過例項化加點來訪問它的屬性
這個方法適用於任意的物件
>>>from django.template import Template, Context
>>>class Person(object):
>>> def __init__(self, first_name, last_name):
>>> self.first_name = first_name
>>> self.last_name = last_name
>>>t = Template("Hello, {{ person.first_name }} {{ person.last_name }}.")
>>>c = Context({"person": Person("yang", "wei")})
>>>t.render(c)
執行結果為:
>>>Hello, yang wei.
2.2.5 引用物件的方法
例如,每個Python字串都有upper()和isdigit()方法,那麼在模板中可以使用同樣的句點語法來呼叫它們:
>>>from django.template import Template, Context
>>>t = Template("{{ var }}--{{ var.upper}}--{{var.isdigig}}")
>>>t.render(Context({"var": "hello"}))
>>>t.render(Context({"var": "123"}))
執行結果為:
>>>hello -- HELLO -- False
>>>123 -- 123 -- True
這裡有一點要注意的是,模板語法和python語法在呼叫方法時是不一樣的。
模板語法在呼叫方法時,並沒有使用圓括號,而且也沒有辦法給該方法傳遞引數。
所以,在模板語法中只能呼叫不需要引數的方法。
2.3 變數的過濾器(filter)的使用
語法格式: {{ obj|filter:param }}
語法有:
(1)add : 給變數加上相應的值
(2)addslasher : 給變數中的引號前加上斜線
(3)capfirst : 首字母大寫
(4)cut : 從字串中移除指定的字元
(5)date : 格式化日期字串
(6)default : 如果值是False,就替換成設定的預設值,否則就是用本來的值
(7)default_if_none : 如果值是None,就替換成設定的預設值,否則就使用本來的值
(7)truncatewords:5 保留5個單詞長度,其餘為...
(8)truncatechars:5 保留5個字元長度,其餘為...
2.3.1 upper
#value1 = "aBcDe"
{{ value1|upper }}
執行結果為:
ABCDE
2.3.2 add
#value2 = 5
{{ value2|add:3}}
執行結果為:
8
2.3.3 cut
#value3 = "he llo wo r ld"
value3|cut: " "
執行結果為:
helloworld
2.3.4 date
#import datetime
#value4 = datetime.detetime.now()
{{ value4|date:"Y-m-d"}}
執行結果為:
2018-09-10
2.3.5 default
#value5=[]
{{ value5|default:"nothing"}}
執行結果為:
nothing
2.3.6 自動轉義
#value6='<a href="#">跳轉</a>'
{{ value6 }}
執行結果為:
<a href="#">跳轉</a>
2.3.7 去掉自動轉義
去掉自動轉義有兩種方法:
一種方法是:
#value6='<a href="#">跳轉</a>'
{% autoescape off %}
{{ value6 }}
{% endautoescape %}
另一種方法是:
#value6='<a href="#">跳轉</a>'
{{value6|safe}}
2.3.8 striptags
striptags作用:去掉value中的所有html值
#value6='<a href="#">跳轉</a>'
{{ value|striptags }}
執行結果為:
跳轉
2.3.9 filesizeformat
filesizeformat作用:轉化為kb格式
#value7='1234'
value7|filesizeformat:{{ value7|filesizeformat }}
執行結果為:
value7|filesizeformat:1.2KB
2.3.10 first
first作用:獲取第一個字元
#value7='1234'
value7|first:{{ value7|first }}
執行結果為:
value7|first:1
2.3.11 length
length: 長度
#value7='1234'
value7|length:{{ value7|length }}
執行結果為:
value7|length:4
2.3.12 slice
slice:切片
#value7='1234'
{{ value7|slice:":-1" }}
執行結果為:
value7|slice:":-1"123