首页 > 其他 > 详细

django学习系列之模板系统篇(一)

时间:2014-02-13 06:07:51      阅读:348      评论:0      收藏:0      [点我收藏+]

首先,解释一下django的模板。

模板就是MTV模式中的Template。在我看来,模板用来定义html文档的,当然这只是狭义的说法。

一个模板包含区块标签和变量。


区块标签简单说就是标记。比如说一个区块标签可以生成内容,可以作为一个控制结构,可以获取数据库内容,或者访问其他的模板标签。

还是太抽象,举例说明就容易懂了。


区块标签被{%%}包含:

{% if is_logged_in %}

Thanks for logging in!

{% else %}

Please log in.

{% endif %}

是不是有点似懂非懂?不急,等下详细解释。


变量是在模板里用来输出值的标记。变量标签被{{}}包含。

比如,Myname is {{ name }}.具体输出什么就看name变量的值是什么了。

对于变量,还可以使用过滤器filters

比如说这一句,<p>It‘sscheduled to ship on {{ ship_date|date:"F j, Y" }}.</p>

{{ ship_date|date:"F j, Y"}}将变量ship_datedate过滤器来转换,转换的参数是”Fj, Y”,即是date过滤器根据指定的参数格式输出。

用法:过滤器是用管道字符(| )来调用的。


还有一个重量级人物:context。上面是怎么将{{name }}替换成‘Michael‘的呢?靠的就是contextContext是传递给模板的名称与值的映射。


前面说到模板用来定义html文档的,怎么将模板转换成html呢?渲染。

渲染通过从context获取值来替换模板中的变量并执行所有的区块标签。


这下逻辑是不是清晰一点了?接下来说明模板系统。

模板系统就是很多模板的意思。废话,那就说模板系统的用法。


使用模板系统的步骤:

1.创建模板对象:创建一个Template对象,可以用代码或者指定路径;

2.模板渲染:调用Template对象的render()方法并提供给他变量的值。

这样它就会返回一个完整的模板字符串内容,包含了所有标签块与变量解析后的内容。


下面先给一个交互式示例,打开pythonshell

>>> fromdjango.template import Context, Template

>>> t =Template("My name is {{ name }}.") #创建模板对象

>>> c =Context({"name": "Michael"}) #创建上下文对象

>>>t.render(c) #渲染模板

‘My name isMichael.‘

在文件里怎么用呢?打开你的views.py文件,添加代码:

fromdjango.template import Template, Context

from django.httpimport HttpResponse

import datetime


defcurrent_datetime(request):

now =datetime.datetime.now()

t =Template("<html><body>It is now {{ current_date}}.</body></html>")

html =t.render(Context({‘current_date‘: now}))

returnHttpResponse(html)

跟前面一样,只是多了一个HttpResponse,它表示应答http请求。


接着主要讲一些基本的模板标签和过滤器的用法。


模板标签

1.if/else

这个不详细讲,只讲要注意的地方:

1)在每个{%if %}标签的结尾都要有{%endif %}结束。

2{%if %}标签接受andor或者not来对多个变量做判断,但不允许在同一个标签中同时使用andor。例如:

{% if A and B%} #正确

{% if A and B orC %} #错误

3)不支持用圆括号来组合比较操作。

2.for

用法示例:

{% for item inlist %}

<p>{{forloop.counter }}: {{ item }}</p>

{% endfor %}

不解释,一看就明白。

补充:

1django不支持退出循环,也不支持 continue 语句。

2{%for %}标签有一个特殊的forloop模板变量,这个变量能提供一些额外的信息:

forloop.counter执行次数的计数器,从1开始。

forloop.counter0forloop.counter类似,不过从0开始。

forloop.revcounter表示循环中剩余项,结束项被置1

forloop.revcounte0forloop.revcounter类似,不过结束项被置0

forloop.first布尔值,在第一次循环时为True

forloop.last布尔值,在最后一次循环时为True,一个常见的用法是在一系列链接之间放置管道符。

比如,{%for link in links %}{{ link }}{% if not forloop.last %} | {% endif%}{% endfor %}

输出可能是这样:Link1| Link2 | Link3 | Link4

forloop.parentloop是一个指向当前循环的上一级循环的forloop对象的引用(在嵌套循环的情况下)。

最后提醒一下,forloop变量只能在循环中使用。


3.ifequal/ifnotequal

if标签类似。


顺便提一下,在模板里面注释使用{##}


过滤器

用法:{{variable | filter1 | filter2}}

从上面可以看出,过滤器可以串联,就是一个过滤器的输出可以再被下一个过滤器过滤。

有些过滤器有参数,参数总是使用双引号引着。


这里给出一些常用的过滤器:

1.addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。这在处理包含 JavaScript的文本时是非常有用的。

2.date : 按指定的格式字符串参数格式化date 或者datetime 对象。

比如:{{ pub_date|date:"F j, Y" }}

3.escape : 转义&符号,引号,<> 符号。这在确保用户提交的数据是有效的 XMLXHTML

时是非常有用的。具体上, escape 做下面这些转换:

转换& &amp;

转换< &lt;

转换> &gt;

转换" ( 双引号) &quot;

转换‘ ( 单引号) &#39;

4.length : 返回变量的长度。你可以对列表或者字符串,或者任何知道怎么测定长度的Python

对象使用这个方法(也就是说,有__len__() 方法的对象)。



django学习系列之模板系统篇(一)

原文:http://blog.csdn.net/whoami021/article/details/19126193

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!