Django1.7模板API

基础部分

模板是一个文档或者说一个普通的python字符串由Django模板语言标记而成。一个模板语言可以包括block标签或者是变量。

一个block标签是一个处于模板中的标记,能过完成一些事情。

Block的定义看起来有点模糊,这是django开发团队有意为之的。比如一个block标签即可以用来输出内容;也可以被当做一个控制结构(比如if声明或者是for循环)从数据库中抓去数据;或者是通往另一个模板的入口。

Block标签由”{%”和”%}”组成。

比如一个模板有如下标签

{% if is_logged_in%}Thanksfor logging in!{%else %}Pleaselog in.{%endif %}

变量用于是在模板里输出一个值的符号。

变量标签由”{ {”和”}}”组成。

比如:

My first name is { { first_name}}. Mylast name is{ { last_name}}.

一个Context是指一个传入模板的由“变量名”到“变量值”的映射。

(原文:A context is a “variable name” -> “variable value” mapping thatis passed to a template.)

一个模板通过变量值来填补context中对应变量的“空缺”(译者注:像填空一样吧)和执行block标签来完成一个context的渲染。

使用模板系统

Template类

在django中使用模板系统是一个两部过程:

         首先,你将一个未经处理的模板代码编译成一个template对象。

         然后,你调用Template中的render()方法,并赋予其一个context。

编译一个字符串

创建一个Template对象最简单的方法就是直接初始化它。这个类位于django.template.Template中。其构造器需要一个参数——一个未经处理的模板代码。

>>> fromdjango.template importTemplate

>>> t= Template("Myname is { { my_name }}.")

>>> print(t)

<django.template.Template instance>

幕后

系统只对传入的未经处理的模板代码处理一次——在你创建Template对象的时候。从此以后,出于性能考虑它在内部被当做一个的“节点”结构(node structure)储存起来。

及时这个处理非常迅速。大多数处理在两个表达式之间的短暂地、常规地的调用时发生。

渲染一个context

Render

一旦你有一个编译过的Template对象,你就能用它渲染一个context或者操作多个context。Context类存在于django.template.Context,需要两个参数(可选的)来完成构造:

n  一个带有name和对应value的字典

n  现用应用的名字,这个应用的名字用于帮助解决URL的命名空间(Reversingnamespaced URLs)。如果你不使用命名空间化过(namespaced)的URL,你可以忽略这个参数

context调用Template对象的render()来“填充”模板:

>>> fromdjango.template importContext,Template

>>> t= Template("Myname is { { my_name }}.")

>>> c= Context({ "my_name":"Adrian"})

>>> t.render(c)

"My name is Adrian."

>>> c= Context({ "my_name":"Dolores"})

>>> t.render(c)

"My name is Dolores."

 

变量及查询  变量名包括为字母、数字以及_或者.

.在模板渲染中有特别的含义。一个.在变量名中表示查询。尤其是当模板系统遇见变量名中的一个‘.’时,它会尝试去进行以下查找,查询顺序如下:

n  字典查询。比如:foo[“bar”]

n  属性查询。比如:foo.bar

n  列表查询。比如foo[bar]

注意:像{ { foo.bar }} 中的“bar”在模板标记中将会被当做一个字符串,而非变量bar的值,当bar在模板的context中存在的话。

模板系统将会采用以上3中查询中首先生效的那个查询方式。这是一个短循环逻辑。比如:

>>> fromdjango.template importContext, Template

>>> t= Template("My name is { {person.first_name }}.")

>>> d= { "person": { "first_name":"Joe", "last_name": "Johnson"}}

>>> t.render(Context(d))

"My name is Joe."

>>> classPersonClass:pass

>>> p= PersonClass()

>>> p.first_name= "Ron"

>>> p.last_name= "Nasty"

>>> t.render(Context({ "person": p}))

"My name is Ron."

>>> t= Template("The first stooge inthe list is { { stooges.0 }}.")

>>> c= Context({ "stooges": ["Larry","Curly", "Moe"]})

>>> t.render(c)

"Thefirst stooge in the list is Larry."

如果一个变量的任何一个部分是可调用的,模板会尽量去调用它,比如:

>>> classPersonClass2:

... defname

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值