您的位置:首页 > 编程语言 > Go语言

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

2014-02-12 17:57 316 查看
首先,解释一下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_date用date过滤器来转换,转换的参数是”Fj,
Y”,即是date过滤器根据指定的参数格式输出。
用法:过滤器是用管道字符(| )来调用的。
还有一个重量级人物:context。上面是怎么将{{name
}}替换成'Michael'的呢?靠的就是context。Context是传递给模板的名称与值的映射。
前面说到模板用来定义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

def current_datetime(request):
    now = datetime.datetime.now()
    t = Template("<html><body>It is now {{ current_date}}.</body></html>")
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)


跟前面一样,只是多了一个HttpResponse,它表示应答http请求。
接着主要讲一些基本的模板标签和过滤器的用法。
模板标签
1.if/else
这个不详细讲,只讲要注意的地方:
1)在每个{%if %}标签的结尾都要有{%endif
%}结束。
2){%if %}标签接受and,or或者not来对多个变量做判断,但不允许在同一个标签中同时使用and和or。例如:
{% if A and B%} #正确
{% if A and B orC %} #错误
3)不支持用圆括号来组合比较操作。
2.for
用法示例:

{% for item inlist %}
<p>{{forloop.counter }}: {{ item }}</p>
{% endfor %}


不解释,一看就明白。
补充:
1)django不支持退出循环,也不支持continue语句。
2){%for %}标签有一个特殊的forloop模板变量,这个变量能提供一些额外的信息:
forloop.counter执行次数的计数器,从1开始。
forloop.counter0跟forloop.counter类似,不过从0开始。
forloop.revcounter表示循环中剩余项,结束项被置1。
forloop.revcounte0跟forloop.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 :
转义&符号,引号,<,>符号。这在确保用户提交的数据是有效的XML或XHTML
时是非常有用的。具体上,escape做下面这些转换:

转换&到&
转换<到<
转换>到>
转换" (双引号)到"
转换' (单引号)到'

4.length :
返回变量的长度。你可以对列表或者字符串,或者任何知道怎么测定长度的Python
对象使用这个方法(也就是说,有__len__()方法的对象)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: