剖析Django中模版标签的解析与参数传递


Posted in Python onJuly 21, 2015

分析直至另一个模板标签

模板标签可以像包含其它标签的块一样工作(想想 {% if %} 、 {% for %} 等)。 要创建一个这样的模板标签,在你的编译函数中使用 parser.parse() 。

标准的 {% comment %} 标签是这样实现的:

def do_comment(parser, token):
  nodelist = parser.parse(('endcomment',))
  parser.delete_first_token()
  return CommentNode()

class CommentNode(template.Node):
  def render(self, context):
    return ''

parser.parse() 接收一个包含了需要分析的模板标签名的元组作为参数。 它返回一个django.template.NodeList实例,它是一个包含了所有Node对象的列表,这些对象是解析器在解析到任一元组中指定的标签之前遇到的内容.

因此在前面的例子中, nodelist 是在 {% comment %} 和 {% endcomment %} 之间所有节点的列表,不包括 {% comment %} 和 {% endcomment %} 自身。

在 parser.parse() 被调用之后,分析器还没有清除 {% endcomment %} 标签,因此代码需要显式地调用 parser.delete_first_token() 来防止该标签被处理两次。

之后 CommentNode.render() 只是简单地返回一个空字符串。 在 {% comment %} 和 {% endcomment %} 之间的所有内容都被忽略。
分析直至另外一个模板标签并保存内容

在前一个例子中, do_comment() 抛弃了{% comment %} 和 {% endcomment %} 之间的所有内容。当然也可以修改和利用下标签之间的这些内容。

例如,这个自定义模板标签{% upper %},它会把它自己和{% endupper %}之间的内容变成大写:

{% upper %}
  This will appear in uppercase, {{ user_name }}.
{% endupper %}

就像前面的例子一样,我们将使用 parser.parse() 。这次,我们将产生的 nodelist 传递给 Node :

def do_upper(parser, token):
  nodelist = parser.parse(('endupper',))
  parser.delete_first_token()
  return UpperNode(nodelist)

class UpperNode(template.Node):
  def __init__(self, nodelist):
    self.nodelist = nodelist

  def render(self, context):
    output = self.nodelist.render(context)
    return output.upper()

这里唯一的一个新概念是 UpperNode.render() 中的 self.nodelist.render(context) 。它对节点列表中的每个 Node 简单的调用 render() 。

Python 相关文章推荐
一则python3的简单爬虫代码
May 26 Python
pycharm 使用心得(二)设置字体大小
Jun 05 Python
Python正则表达式的使用范例详解
Aug 08 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
Python线程创建和终止实例代码
Jan 20 Python
用Python实现大文本文件切割的方法
Jan 12 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
用Python 执行cmd命令
Dec 18 Python
Python max函数中key的用法及原理解析
Jun 26 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 #Python
在Django的上下文中设置变量的方法
Jul 20 #Python
在Django中编写模版节点及注册标签的方法
Jul 20 #Python
在Python的Django框架中编写编译函数
Jul 20 #Python
Python的Django框架中自定义模版标签的示例
Jul 20 #Python
详解在Python的Django框架中创建模板库的方法
Jul 20 #Python
简单介绍Python的Django框架加载模版的方式
Jul 20 #Python
You might like
PHP经典的给图片加水印程序
2006/12/06 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
Python过滤txt文件内重复内容的方法
2018/10/21 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
Pytorch转tflite方式
2020/05/25 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
公司财务总监岗位职责
2013/12/14 职场文书
英语专业自荐书
2014/06/13 职场文书
启动仪式策划方案
2014/06/14 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS