剖析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中的struct模块
Apr 28 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
Python中fnmatch模块的使用详情
Nov 30 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
python使用Pandas库提升项目的运行速度过程详解
Jul 12 Python
Python 硬币兑换问题
Jul 29 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
python实现PCA降维的示例详解
Feb 24 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 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
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
Python 除法小技巧
2008/09/06 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
python 列表降维的实例讲解
2018/06/28 Python
python同步windows和linux文件
2019/08/29 Python
pytest中文文档之编写断言
2019/09/12 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
解决python3输入的坑——input()
2020/12/05 Python
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
经理管理专业自荐信范文
2013/12/31 职场文书
大学生村官典型材料
2014/01/12 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
小学毕业感言500字
2014/02/28 职场文书
2014年元旦感言
2014/03/06 职场文书
运动会演讲稿300字
2014/08/25 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
老龙头导游词
2015/02/11 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
廉政承诺书范文
2015/04/28 职场文书
高考1977观后感
2015/06/04 职场文书