剖析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中的装饰器详解
Apr 13 Python
python 的列表遍历删除实现代码
Apr 12 Python
python 设置文件编码格式的实现方法
Dec 21 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
python图片二值化提高识别率代码实例
Aug 24 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
Apr 20 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 Python
python如何使用代码运行助手
Jul 03 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
批量修改RAR文件注释的php代码
2010/11/20 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
利用Python破解验证码实例详解
2016/12/08 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
python3中rank函数的用法
2019/11/27 Python
Python实现结构体代码实例
2020/02/10 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
python右对齐的实例方法
2020/07/05 Python
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
实现向右循环移位
2014/07/31 面试题
公务员年总结的自我评价
2013/10/25 职场文书
社区八一活动方案
2014/02/03 职场文书
网络教育自我鉴定
2014/02/04 职场文书
给老师的一封建议书
2014/03/13 职场文书
广播体操比赛口号
2014/06/10 职场文书
关于诚信的活动方案
2014/08/18 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
Nginx的基本概念和原理
2022/03/21 Servers
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript