剖析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复制与引用用法分析
Apr 08 Python
python WindowsError的错误代码详解
Jul 23 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
Python实现矩阵转置的方法分析
Nov 24 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
python spyder中读取txt为图片的方法
Apr 27 Python
python 调用钉钉机器人的方法
Feb 20 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
基于python的Paxos算法实现
Jul 03 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
python点击鼠标获取坐标(Graphics)
Aug 10 Python
如何基于python实现脚本加密
Dec 28 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登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
Vue的百度地图插件尝试使用
2017/09/06 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python正则简单实例分析
2017/03/21 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
Python读写锁实现实现代码解析
2020/11/28 Python
python之随机数函数的实现示例
2020/12/30 Python
《赠汪伦》教学反思
2014/04/12 职场文书
cf战队收人口号
2014/06/21 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
离婚协议书范文2014
2014/10/16 职场文书
早恋主题班会
2015/08/14 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫