在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类,仅需一个参数,参数为模板的原始代码,为了提高性能,系统只解析模板源代码一次,之后在内部以树形结构存储。
四、渲染上下文
在模板对象编辑完成之后,我们就可以用改模板对象来渲染上下文,同一个模板对象可以用不同的上下文渲染多次。
Context对象在被实例化之后也可以向其中添加元素和去除元素,下面介绍几种操作context对象的常用方法:
删除或添加一项
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
with push()实例:
update()的功能与push()方法相同,但是传递的参数格式不同,update的参数为dict,也可以使用上下文管理器with,以保证with中的代码执行之后,调用pop()方法。实例如下:
flatten()方法可以使所有context中的元素(包括內建的变量),都合并到一个dict中。
第一步,配置引擎
第二步,向模板中编辑模板代码
第三步,利用上下文渲染模板
二、配置模板引擎
三、加载模板
推荐使用三种工厂方法创建模板,分别是:
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'}
相关文章推荐
- 这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下
- 【Django】Python web开发:几个模板系统的性能对比(转)
- 这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下
- python学习笔记--Django入门二 Django 的模板系统
- Python -----Web----Django模板系统
- 这几天有django和python做了一个多用户博客系统(可选择模板)
- django 模板(template)中操作 python tuple
- ThinkPHP模板替换与系统常量及应用
- Django模板系统(非常详细)
- [Django模板系统]在模板中加载css/js等静态文件
- 用Python和Django实现多用户博客系统(二)——UUBlog
- Ubuntu12.04系统下写你的第一个Django1.5应用(四)--form
- 在生产系统使用Tornado WebServer来代替FastCGI加速你的Django应用
- python之路-----web应用的创建(python3.4下,django连接mysql)
- 在生产系统使用Tornado WebServer来代替FastCGI加速你的Django应用
- python django -4 模板
- Mac 基于Python搭建Django应用框架
- Python Django之路由系统
- win+pycharm+django+mysql开发(win系统pythonweb开发)(三)
- Python Django 之 模板