剖析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 相关文章推荐
Python遍历目录的4种方法实例介绍
Apr 13 Python
pycharm设置注释颜色的方法
May 23 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
python 保存float类型的小数的位数方法
Oct 17 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
python3.5安装python3-tk详解
Apr 26 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
Jun 19 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
解决tensorflow 释放图,删除变量问题
Jun 23 Python
如何快速理解python的垃圾回收机制
Sep 01 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函数(简单整理)
2010/04/30 PHP
php使用curl访问https示例分享
2014/01/17 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
犀利的js 函数集合
2009/06/11 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
JS动态日期时间的获取方法
2015/09/28 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
php中and 和 &&出坑指南
2018/07/13 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
python交易记录整合交易类详解
2019/07/03 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
医科大学生毕业的自我评价分享
2013/11/12 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
运动会入场解说词
2014/02/07 职场文书
高中班主任寄语
2019/06/21 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang