剖析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+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
Python读取word文本操作详解
Jan 22 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
基于python-opencv3的图像显示和保存操作
Jun 27 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
python多任务之协程的使用详解
Aug 26 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
Python matplotlib可视化实例解析
Jun 01 Python
python神经网络编程之手写数字识别
May 08 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
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
2016/05/17 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
菜鸟javascript基础资料整理2
2010/12/06 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
python中xlrd模块的使用详解
2021/02/01 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
H5调用相机拍照并压缩图片的实例代码
2017/07/20 HTML / CSS
次世代生活态度:Hypebeast
2018/07/05 全球购物
优秀研究生自我鉴定
2013/12/04 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL