剖析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二维码生成库qrcode安装和使用示例
Dec 16 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
Python实现的科学计算器功能示例
Aug 04 Python
python中的break、continue、exit()、pass全面解析
Aug 05 Python
Python探索之pLSA实现代码
Oct 25 Python
详解Python中的type和object
Aug 15 Python
Pandas过滤dataframe中包含特定字符串的数据方法
Nov 07 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
简单了解Django ContentType内置组件
Jul 23 Python
详解用python生成随机数的几种方法
Aug 04 Python
python 字段拆分详解
Dec 17 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 24 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版(2)
2006/10/09 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
PHP6新特性分析
2016/03/03 PHP
php简单中奖算法(实例)
2017/08/15 PHP
splice slice区别
2006/10/09 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python通过Pygame绘制移动的矩形实例代码
2018/01/03 Python
python实现学生管理系统
2018/01/11 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
Python os模块常用方法和属性总结
2020/02/20 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
新西兰优惠网站:Treat Me
2019/07/04 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
商务助理岗位职责
2013/11/13 职场文书
师生聚会感言
2014/01/26 职场文书
绩效考核实施方案
2014/03/18 职场文书
班级寄语大全
2014/04/10 职场文书
初中新生军训方案
2014/05/13 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
安全主题班会教案
2015/08/12 职场文书