剖析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 相关文章推荐
下载安装setuptool和pip linux安装pip    
Jan 24 Python
解决Python传递中文参数的问题
Aug 04 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
python获取外网IP并发邮件的实现方法
Oct 01 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
浅谈tensorflow 中tf.concat()的使用
Feb 07 Python
python为什么要安装到c盘
Jul 20 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
Python中常见的导入方式总结
May 06 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
PHP4实际应用经验篇(6)
2006/10/09 PHP
Destoon实现多表查询示例
2014/08/21 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jquery获取节点名称
2015/04/26 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
vue-loader教程介绍
2017/06/14 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
[52:27]2018DOTA2亚洲邀请赛 3.31 小组赛B组 paiN vs Secret
2018/04/01 DOTA
python:socket传输大文件示例
2017/01/18 Python
python list排序的两种方法及实例讲解
2017/03/20 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
入党积极分子思想汇报范文
2014/01/05 职场文书
2014年教师节活动总结
2014/08/29 职场文书
党员倡议书
2015/01/19 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
Python语言规范之Pylint的详细用法
2021/06/24 Python
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
mysql分表之后如何平滑上线详解
2021/11/01 MySQL
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript