剖析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 创建子进程模块subprocess详解
Apr 08 Python
Python使用xlrd模块操作Excel数据导入的方法
May 26 Python
python3.5实现socket通讯示例(TCP)
Feb 07 Python
多版本Python共存的配置方法
May 22 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
Nov 23 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
Python求正态分布曲线下面积实例
Nov 20 Python
Python实现CNN的多通道输入实例
Jan 17 Python
Python模块相关知识点小结
Mar 09 Python
python爬虫selenium模块详解
Mar 30 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 21 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
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
javascript &&和||运算法的另类使用技巧
2009/11/28 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
nodejs命令行参数处理模块commander使用实例
2014/09/17 NodeJs
jQuery验证插件 Validate详解
2014/11/20 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
2017/06/08 jQuery
Angular4学习笔记router的简单使用
2018/03/30 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
Python实现去除代码前行号的方法
2015/03/10 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
给老师的道歉信
2014/01/11 职场文书
实习单位接收函
2014/01/11 职场文书
爽歪歪广告词
2014/03/20 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
预备党员公开承诺书
2014/05/28 职场文书
会计电算化专业求职信
2014/06/10 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
杨善洲电影观后感
2015/06/04 职场文书
长征观后感
2015/06/09 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js
SQL SERVER中的流程控制语句
2022/05/25 SQL Server