剖析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 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
详细介绍Python函数中的默认参数
Mar 30 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
如何利用python查找电脑文件
Apr 27 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
如何关掉pycharm中的python console(图解)
Oct 31 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
Python devel安装失败问题解决方案
Jun 09 Python
sklearn的predict_proba使用说明
Jun 28 Python
python读取xml文件方法解析
Aug 04 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
用libtemplate实现静态网页生成
2006/10/09 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
js实现日历的简单算法
2017/01/24 Javascript
JS验证不重复验证码
2017/02/10 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
大学新生军训自我鉴定
2014/03/18 职场文书
买卖协议书范本
2014/04/21 职场文书
岗位明星事迹材料
2014/05/18 职场文书
门面房租房协议书
2014/08/20 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android