模闆
~~~~
顧名思意,就是一個通用的文檔格式,等待填充動态的資料,形成完整的文檔。
在django裡,模闆通常用于制定html文檔,但是它還可以用于任何文本格式。
如下為模闆的示例:
templates/home.html
____________________________
<html>
<body>
<h1>hello!</h1>
<p>my name is {{name}}.</p>
<p>age: {{age}}.</p>
</body>
</html>
-----------------------------
用{{變量名}}表示會被動态指派的變量
views.py
______________________________________________________
from django.http import httpresponse
from django.template import loader, context
def home(request):
t = loader.get_template('home.html')
#c = context({'name':'hevake lee', 'age':26})
c = context()
c['name'] = 'hevake lee'
c['age'] = 26
content = t.render(c) # template用context生成正文
return httpresponse(content)
------------------------------------------------------
context可以像dict那麼通路。
如果說上面的過程太多,也可以用render_to_response()簡化過程。
________________________________________________
from django.shortcuts import render_to_response
response = render_to_response('home.html',
{'name':'hevake lee', 'age':26})
return response
------------------------------------------------
render_to_response(template_file, context_dict),第一個參數是模闆檔案名稱,
是相對于app_name/templates/的名稱。第二個參數是正文字典,指定模闆中的變量對
應的對象。
注意:轉給模闆的對象,在render()時都會被str(object)成字元串後替換模闆中的變
量。如果發現變量顯示不出來,請檢查一下傳入的對象是否實作__unicode__()之類的
轉換函數。
模闆過濾器
~~~~~~~~~~
模闆架構可以通過叫過濾器(filter)的機制來對context變量進一步處理。
如下:
_________________________________
<ul>
{% for string in string_list %}
<li>{{ string|lower }}</li>
{% endfor %}
</ul>
---------------------------------
用管道符"|",與linux的管理有類似的意義。
預設的filter定義在 django/template/defaultfilters.py 中。
如下為lower()過濾器的定義:
_________________________
def lower(value):
return value.lower()
-------------------------
lower接收一個源始的資料,傳回一個處理後的資料。
lower是沒有帶參數的過濾器,也有帶參數的。
比如truncatechars,它能限定字元顯示長度,對于超出長度的字元用省略号表示。
如:"abcdefg",如果限定為5個,那麼就是"ab..."
templates/truncate.html
________________________________
<p>{{text|truncatechars:5}}</p>
--------------------------------
filter的參數是以冒号":"開始。上面表示限制字元個數為5.
_______________________________________________________________________
def truncate(request):
response = render_to_response('truncate.html', {'text':'abcdefgh'})
-----------------------------------------------------------------------
通路得到:
<p>ab...</p>
我們看一下filter truncatechars的定義:
_________________________________________
def truncatechars(value, arg):
length = int(arg)
return truncator(value).chars(length)
-----------------------------------------
上面例子轉入的value="abcdefgh", arg=5
看到這裡,我們也就能了解filter究竟是怎麼回事兒了。
控制标簽
~~~~~~~~
除了{{變量名}}之外,還有控制邏輯的标簽,它們都是{% xxxx %}格式的。
{% for item in list_or_tupe %} ... {% endfor %}
{% if %} ... {% endif %}
{% ifequal %} ... {% endifequal %}
{% block block_name %} ... {% endblock %}
{% extends file_name %}
{% include file_name %}
for語句
~~~~~~~
for語句中提供一個局部變量{{forloop}},它可以提供許多有用的資訊。如:
{{forloop.first}},boolean,表示是否是第一個元素
{{forloop.last}},boolean,表示是否是最後一個元素
{{forloop.counter}},int,表示循環計數:1,2,3...
{{forloop.counter0}},int,表示循環計數:0,1,2...
block與extends
~~~~~~~~~~~~~~
{%block block_name%}...{%endblock%}中間的部分叫block。
{%extends "file_name"%}表示目前這個子產品繼承于file_name這個模闆。
block的特性是,如果有其它的模闆extends該模闆,如有同名的block,那麼就會用新
的block替代舊的block。這個有些類似c++裡的類繼承,子類可以重寫父類的虛函數。
比如:
base.html
______________________________________
<html><body>
<p>{%block abc%}base page{%endblock%}</p>
</body></html>
--------------------------------------
定義了abc這個block。
extend.html
{%extends "base.html"%}
{%block abc%}extend page{%endblock%}
extend.html繼承于base.html,并重新定義了block abc。
模闆base.html生成的html:
__________________
<p>base page</p>
------------------
對應的extend.html生成的html為:
<p>extend page</p>
include包含
~~~~~~~~~~~
{%include "file_name"%}
這很像c/c++裡的#inlcude,也像shell中的source,就是将指定檔案的内容替換該語
句。
注:extend與include指令能接受字元串也能接受變量。這樣就可以讓模闆動态地由上
下文決定要包含或繼承于哪個子產品了。