您的位置:首页 > 编程语言 > Python开发

在python中应用Django的模板系统

2017-07-27 09:24 633 查看
一、在python中使用Django的模板系统分为三个步骤:

第一步,配置引擎

第二步,向模板中编辑模板代码

第三步,利用上下文渲染模板

二、配置模板引擎

三、加载模板

推荐使用三种工厂方法创建模板,分别是:

get_template(template_name) 利用模板名字返回模板对象

select_template(template_name_list) 找出模板名字中的第一个模板

from_string(template_code) 利用模板代码,返回模板对象

在django项目中,如果settings.py文件中已经正确定义了一个django模板引擎,则可以直接实例化一个模板。

Template类,仅需一个参数,参数为模板的原始代码,为了提高性能,系统只解析模板源代码一次,之后在内部以树形结构存储。

from django.template import Template

template = Template("My name is {{ my_name }}.")


四、渲染上下文

在模板对象编辑完成之后,我们就可以用改模板对象来渲染上下文,同一个模板对象可以用不同的上下文渲染多次。

>>> from django.template import Context, Template
>>> template = Template("My name is {{ my_name }}.")

>>> context = Context({"my_name": "Adrian"})
>>> template.render(context)
"My name is Adrian."

>>> context = Context({"my_name": "Dolores"})
>>> template.render(context)
"My name is Dolores."


Context对象在被实例化之后也可以向其中添加元素和去除元素,下面介绍几种操作context对象的常用方法:

删除或添加一项

>>> from django.template import Context

>>> c = Context({"foo": "bar"})

>>> c['foo']

'bar'

>>> del c['foo']

>>> c['foo']

Traceback (most recent call last):

...

KeyError: 'foo'

>>> c['newvariable'] = 'hello'

>>> c['newvariable']

'hello'


get(key, otherwise=None) key存在,则返回key对应的value,不存在,则返回None

setdefault(key, default=None) key存在,则返回key对应的value,不存在,插入该key为其设置默认值,并返回默认值。

context对象是一个堆,所以有pop和push方法,当pop越界时,会抛出django.template.ContextPopException异常

pop() # 获取队尾元素

push() # 向堆中添加元素,不传参默认添加{}

4000

from django.template import Context

context = Context()
print "original context", context
context["a"] = "a"
context["b"] = "b"
print "first level context", context
context.push(foo="***********")
context["abc"] = "abc"
context["efg"] = "efg"
print "second level context", context
context.push()
context["hij"] = "hij"
context["klm"] = "klm"
print "third level context", context
print "first pop",context.pop()
print "second pop",context.pop()
print "third pop",context.pop()
print "forth pop",context.pop()

输出结果为:
riginal context [{'False': False, 'None': None, 'True': True}]
# 当Context()不传递参数时,添加默认结构{'False': False, 'None': None, 'True': True},
# 如果传递参数,比如传递Context({"original":"original"}),则返回结果变为riginal context [{'False': False, 'None': None, 'True': True},{"original":"original"}]
first level context [{'a': 'a', 'False': False, 'None': None, 'b': 'b', 'True': True}]
second level context [{'a': 'a', 'False': False, 'None': None, 'b': 'b', 'True': True}, {'foo': '***********', 'abc': 'abc', 'efg': 'efg'}]
third level context [{'a': 'a', 'False': False, 'None': None, 'b': 'b', 'True': True}, {'foo': '***********', 'abc': 'abc', 'efg': 'efg'}, {'klm': 'klm', 'hij': 'hij'}]
first pop {'klm': 'klm', 'hij': 'hij'}
second pop {'foo': '***********', 'abc': 'abc', 'efg': 'efg'}
third pop Internal Server Error:ContextPopException
# context.push()之后会向context的列表中append一个{},
# 也可使用context.push(foo="***********"),这样会向context的列表中append一个{"foo":"***********"},
# 当len(context列表) == 1时,调用pop()方法,会报ContextPopException异常。
# 源码如下:
def pop(self):
if len(self.dicts) == 1: # self.dicts为context的列表
raise ContextPopException
return self.dicts.pop()


with push()实例:

context = Context({"original":"original"})
print "original context", context
context["a"] = "a"
context["b"] = "b"
print "first level context", context
with context.push():
context["a"] = "abc"
context["b"] = "efg"
print "second level context", context
print "a", context["a"]
print "b", context["b"]
print "a", context["a"]
print "b", context["b"]

# 输出结果:
original context [{'False': False, 'None': None, 'True': True}, {'original': 'original'}]
first level context [{'False': False, 'None': None, 'True': True}, {'a': 'a', 'b': 'b', 'original': 'original'}]
second level context [{'False': False, 'None': None, 'True': True}, {'a': 'a', 'b': 'b', 'original': 'original'}, {'a': 'abc', 'b': 'efg'}]
a abc
b efg
a a
b b


update()的功能与push()方法相同,但是传递的参数格式不同,update的参数为dict,也可以使用上下文管理器with,以保证with中的代码执行之后,调用pop()方法。实例如下:

context = Context({"original":"original"})
print "original context", context
context.update({"a":"a", "b":"b"})
print "second level context", context

# 输出结果
original context [{'False': False, 'None': None, 'True': True}, {'original': 'original'}]
second level context [{'False': False, 'None': None, 'True': True}, {'original': 'original'}, {'a': 'a', 'b': 'b'}]


flatten()方法可以使所有context中的元素(包括內建的变量),都合并到一个dict中。

template = Template("酒店名称:{{hotelname}}")
context = Context({"original":"original"})
print "original context", context
context.update({"a":"a", "b":"b"})
print "second level context", context
print "flatten result", context.flatten()

# 输出结果
original context [{'False': False, 'None': None, 'True': True}, {'original': 'original'}]
second level context [{'False': False, 'None': None, 'True': True}, {'original': 'original'}, {'a': 'a', 'b': 'b'}]
flatten result {'a': 'a', 'None': None, 'b': 'b', 'False': False, 'True': True, 'original': 'original'}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: