详解Python的Django框架中的模版相关知识
HTML被直接硬编码在Python代码之中。
defcurrent_datetime(request): now=datetime.datetime.now() html="<html><body>Itisnow%s.</body></html>"%now returnHttpResponse(html)
尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意。让我们来看一下为什么:
- 对页面设计进行的任何改变都必须对Python代码进行相应的修改。站点设计的修改往往比底层Python代码的修改要频繁得多,因此如果可以在不进行Python代码修改的情况下变更设计,那将会方便得多。
- Python代码编写和HTML设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。
- 程序员编写Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含Python又包含HTML的文件的编辑工作。
基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。我们可以使用Django的模板系统(TemplateSystem)来实现这种模式,这就是本章要具体讨论的问题。
模板系统基本知识
模板是一个文本,用于分离文档的表现形式和内容。模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签)。模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档。
让我们从一个简单的例子模板开始。该模板描述了一个向某个与公司签单人员致谢HTML页面。可将其视为一个格式信函:
<html> <head><title>Orderingnotice</title></head> <body> <h1>Orderingnotice</h1> <p>Dear{{person_name}},</p> <p>Thanksforplacinganorderfrom{{company}}.It'sscheduledto shipon{{ship_date|date:"Fj,Y"}}.</p> <p>Herearetheitemsyou'veordered:</p> <ul> {%foriteminitem_list%} <li>{{item}}</li> {%endfor%} </ul> {%ifordered_warranty%} <p>Yourwarrantyinformationwillbeincludedinthepackaging.</p> {%else%} <p>Youdidn'torderawarranty,soyou'reonyourownwhen theproductsinevitablystopworking.</p> {%endif%} <p>Sincerely,<br/>{{company}}</p> </body> </html>
该模板是一段添加了些许变量和模板标签的基础HTML。让我们逐步分析一下:
用两个大括号括起来的文字(例如{{person_name}})称为变量(variable)。这意味着在此处插入指定变量的值。如何指定变量的值呢?稍后就会说明。
被大括号和百分号包围的文本(例如{%ifordered_warranty%})是模板标签(templatetag)。标签(tag)定义比较明确,即:仅通知模板系统完成某些工作的标签。
这个例子中的模板包含一个for标签({%foriteminitem_list%})和一个if标签({%ifordered_warranty%})
for标签类似Python的for语句,可让你循环访问序列里的每一个项目。if标签,正如你所料,是用来执行逻辑判断的。在这里,tag标签检查ordered_warranty值是否为True。如果是,模板系统将显示{%ifordered_warranty%}和{%else%}之间的内容;否则将显示{%else%}和{%endif%}之间的内容。{%else%}是可选的。
最后,这个模板的第二段中有一个关于filter过滤器的例子,它是一种最便捷的转换变量输出格式的方式。如这个例子中的{{ship_date|date:”Fj,Y”}},我们将变量ship_date传递给date过滤器,同时指定参数”Fj,Y”。date过滤器根据参数进行格式输出。过滤器是用管道符(|)来调用的,具体可以参见Unix管道符。
Django模板含有很多内置的tags和filters,我们将陆续进行学习.附录F列出了很多的tags和filters的列表,熟悉这些列表对你来说是个好建议.你依然可以利用它创建自己的tag和filters。