天天看點

Django學習筆記之——Templates

模闆

~~~~

顧名思意,就是一個通用的文檔格式,等待填充動态的資料,形成完整的文檔。

在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指令能接受字元串也能接受變量。這樣就可以讓模闆動态地由上

下文決定要包含或繼承于哪個子產品了。