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

首先,解释一下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

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 %}标签接受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__()方法的对象)。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值