剖析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远程桌面协议RDPY安装使用介绍
Apr 15 Python
Python3处理文件中每个词的方法
May 22 Python
python类装饰器用法实例
Jun 04 Python
详解Python中的文件操作
Aug 28 Python
Python实现求数列和的方法示例
Jan 12 Python
Python爬虫获取图片并下载保存至本地的实例
Jun 01 Python
对Python获取屏幕截图的4种方法详解
Aug 27 Python
python seaborn heatmap可视化相关性矩阵实例
Jun 03 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
python中selenium库的基本使用详解
Jul 31 Python
python drf各类组件的用法和作用
Jan 12 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 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安全防范技巧分享
2011/11/03 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
php测试kafka项目示例
2020/02/06 PHP
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
详解vue axios中文文档
2017/09/12 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
vue实现跨域的方法分析
2019/05/21 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
python 读写中文json的实例详解
2017/10/29 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
Python如何实现远程方法调用
2020/08/07 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
春节联欢会主持词
2014/03/24 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
语文教研活动总结
2014/07/02 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
工作经历证明范本
2015/06/15 职场文书
《检阅》教学反思
2016/02/22 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
Java数组详细介绍及相关工具类
2022/04/14 Java/Android