django的模板系统

bigzhu posted @ May 25, 2007 07:05:00 AM in django , 1658 阅读

其实现在的很多web技术,像java,同样也是使用了模板技术.
否则将htm混杂在代码中,是很难维护,很乱很恐怖的事情
模板中的一些定义:

  1. 用{{}}包围的是变量
  2. 用{%%}包围的是块标签,如{%if ordered_warranty%}
    块标签的含义很丰富,它告诉模板系统做一些事情
  3. 过滤器

设置模板路径:
settings中的变量
TEMPLATE_DIRS定义了模板所在的路径.
TEMPLATE_DIRS = (
‘C:\Documents and Settings\Administrator\mysite\\templates’,
# Put strings here, like “/home/html/django_templates”.
# Always use forward slashes, even on Windows.
)
非常奇怪,mysite下面的包templates一定要用\\,否则会被转换为mysite templates报告找不到文件.
在程序中取得模板,需要import这个模块:
from django.template.loader import get_template
然后:
t = get_template(‘current_datetime.html’)
这样就建立了一个模板对象t
在配置的模板路径中能找到这个文件,自然没问题.

现在还没建立模板文件,
在templates中建立内容为:
<html><body>It is now {{ current_date }}.body>html>
的文件current_datetime.html
修改view,增加如下代码:
from django.template.loader import get_template
from django.template import Context
def current_datetime_tmp(request):
now = datetime.datetime.now()
t = get_template(‘current_datetime.html’)
html = t.render(Context({‘current_date’: now}))
return HttpResponse(html)
配置好urls:
(r’^now_tmp/$’, current_datetime_tmp)
打开链接,查看结果:
http://localhost:8000/now_tmp/

填充模板:
填充模板首先需要建立一个context对象,进行值的填充,自然建立context对象需要提供一个字典,
字典的名,自然就映射为变量名,值就是实际需要填充的值
建立好context对象后,调用模板对象的
render方法来进行渲染操作,自然context对象作为render方法的参数提供出来.

建立模板动态页面捷径:
按照上面的流程,每建立一个模板的动态页面,都需要反复的写下面这些操作的代码:
建立模板对象,填充变量,进行渲染,返回HttpResponse
比较土.
所以django提供了一个更简洁的办法来做这些事情.
from django.shortcuts import render_to_response
def current_datetime_tmp_new(request):
now = datetime.datetime.now()
return render_to_response(‘current_datetime.html’, {‘current_date’: now})
只需要提供模板名,用于填充的字典,就全部搞定了.

捷径中的偷懒:

发现一个问题没有?如果需要填充的变量很多,那么手工来建立这些变量的字典,就变成了一项很沉重而且无聊的活动了.
记得python内建的locals()方法么?
locals()会将当前作用域内所有变量组织成一个字典返回.
于是上面那段代码就可以改成这样的:
def current_datetime(request):
current_date = datetime.datetime.now()
return render_to_response(‘current_datetime.html’, locals())
注意,我们这时取消了now,而是直接用 current_date作为变量名,因为填充的时候需要用变量名current_date
如果作用域内有不需要的变量,那么也会被打包到字典里面去
不过应该不会有什么问题,可以实现偷懒..

模板的放置位置:

模板要多了怎么办?
全放到’C:\Documents and Settings\Administrator\mysite\\templates’里面
以后多了找死你
多配几个TEMPLATE_DIRS ?
也是个办法,但是模板存放信息就被割裂了
没必要把模板信息搞得如此的支离破碎.
可以直接在templates下再建一个子目录,比如:moban1
get_template是支持带路径取模板的
t = get_template(‘dateapp/current_datetime.html’)
render_to_response继承自get_template,也同样可以用带路径的.
注意要用unix风格的斜线



登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter