剖析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 相关文章推荐
利用Django框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
Python中新式类与经典类的区别详析
Jul 10 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
Python实现在Windows平台修改文件属性
Mar 05 Python
python在linux环境下安装skimage的示例代码
Oct 14 Python
flask项目集成swagger的方法
Dec 09 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操作xml代码
2010/06/17 PHP
数据库中排序的对比及使用条件详解
2012/02/23 PHP
php批量上传的实现代码
2013/06/09 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
checkbox 多选框 联动实现代码
2008/10/22 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
python通过socket查询whois的方法
2015/07/18 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
Python编码爬坑指南(必看)
2016/06/10 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
2013年入党人员的自我鉴定
2013/10/25 职场文书
大专毕业生自我鉴定
2013/11/21 职场文书
大学社团活动策划书
2014/01/26 职场文书
大学军训感言1000字
2014/02/25 职场文书
大学生简短的自我评价
2014/09/12 职场文书
2014年检验员工作总结
2014/11/19 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
MySQL 查询速度慢的原因
2021/05/25 MySQL
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang