剖析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删除文件示例分享
Jan 28 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
在Django的模型和公用函数中使用惰性翻译对象
Jul 27 Python
Python 中迭代器与生成器实例详解
Mar 29 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
利用python计算windows全盘文件md5值的脚本
Jul 27 Python
Python阶乘求和的代码详解
Feb 14 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
Python 一键获取电脑浏览器的账号密码
May 11 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
Apache设置虚拟WEB
2006/10/09 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
JS 常用校验函数
2009/03/26 Javascript
jQuery 开发者应该注意的9个错误
2012/05/03 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
python执行外部程序的常用方法小结
2015/03/21 Python
python 获取字符串MD5值方法
2018/05/29 Python
python读取Excel实例详解
2018/08/17 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
浅析Python3 pip换源问题
2020/01/06 Python
Python 合并拼接字符串的方法
2020/07/28 Python
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
应届毕业生求职自荐书
2014/01/03 职场文书
我的长生果教学反思
2014/04/28 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
中秋节晚会开场白
2015/05/29 职场文书
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL