剖析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 相关文章推荐
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
python回调函数中使用多线程的方法
Dec 25 Python
Python基于matplotlib实现绘制三维图形功能示例
Jan 18 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
pandas 将list切分后存入DataFrame中的实例
Jul 03 Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 Python
python实现图像拼接
Mar 05 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
python 模拟登陆github的示例
Dec 04 Python
python lambda的使用详解
Feb 26 Python
python数字图像处理:图像简单滤波
Jun 28 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模板中使用PHP函数的方法
2011/04/23 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
phpfpm的作用和用法
2019/10/10 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
juqery 学习之四 筛选查找
2010/11/30 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
Python 用三行代码提取PDF表格数据
2019/10/13 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
解除施工合同协议书
2014/10/17 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript
Python Socket编程详解
2021/04/25 Python