模板
~~~~
顾名思意,就是一个通用的文档格式,等待填充动态的数据,形成完整的文档。
在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.http import HttpResponse
from django.shortcuts import render_to_response
def home(request):
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.
views.py
_______________________________________________________________________
def truncate(request):
response = render_to_response('truncate.html', {'text':'ABCDEFGH'})
return response
-----------------------------------------------------------------------
访问得到:
<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:
__________________
<html><body>
<p>Base Page</p>
</body></html>
------------------
对应的extend.html生成的html为:
__________________
<html><body>
<p>Extend Page</p>
</body></html>
------------------
include包含
~~~~~~~~~~~
{%include "file_name"%}
这很像C/C++里的#inlcude,也像shell中的source,就是将指定文件的内容替换该语
句。
注:extend与include指令能接受字符串也能接受变量。这样就可以让模板动态地由上
下文决定要包含或继承于哪个模块了。