在Python的Django框架中编写编译函数


Posted in Python onJuly 20, 2015

当遇到一个模板标签(template tag)时,模板解析器就会把标签包含的内容,以及模板解析器自己作为参数调用一个python函数。 这个函数负责返回一个和当前模板标签内容相对应的节点(Node)的实例。

例如,写一个显示当前日期的模板标签:{% current_time %}。该标签会根据参数指定的 strftime 格式(参见:http://www.djangoproject.com/r/python/strftime/)显示当前时间。首先确定标签的语法是个好主意。 在这个例子里,标签应该这样使用:

<p>The time is {% current_time "%Y-%m-%d %I:%M %p" %}.</p>

注意

没错, 这个模板标签是多余的,Django默认的 {% now %} 用更简单的语法完成了同样的工作。 这个模板标签在这里只是作为一个例子。

这个函数的分析器会获取参数并创建一个 Node 对象:

from django import template

register = template.Library()

def do_current_time(parser, token):
  try:
    # split_contents() knows not to split quoted strings.
    tag_name, format_string = token.split_contents()
  except ValueError:
    msg = '%r tag requires a single argument' % token.split_contents()[0]
    raise template.TemplateSyntaxError(msg)
  return CurrentTimeNode(format_string[1:-1])

这里需要说明的地方很多:

    每个标签编译函数有两个参数,parser和token。parser是模板解析器对象。 我们在这个例子中并不使用它。 token是正在被解析的语句。

    token.contents 是包含有标签原始内容的字符串。 在我们的例子中,它是 'current_time "%Y-%m-%d %I:%M %p"' 。

    token.split_contents() 方法按空格拆分参数同时保证引号中的字符串不拆分。 应该避免使用 token.contents.split() (仅使用Python的标准字符串拆分)。 它不够健壮,因为它只是简单的按照所有空格进行拆分,包括那些引号引起来的字符串中的空格。

    这个函数可以抛出 django.template.TemplateSyntaxError ,这个异常提供所有语法错误的有用信息。

    不要把标签名称硬编码在你的错误信息中,因为这样会把标签名称和你的函数耦合在一起。 token.split_contents()[0]总是记录标签的名字,就算标签没有任何参数。

    这个函数返回一个 CurrentTimeNode (稍后我们将创建它),它包含了节点需要知道的关于这个标签的全部信息。 在这个例子中,它只是传递了参数 "%Y-%m-%d %I:%M %p" 。模板标签开头和结尾的引号使用 format_string[1:-1] 除去。

    模板标签编译函数 必须 返回一个 Node 子类,返回其它值都是错的。

Python 相关文章推荐
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
python中set常用操作汇总
Jun 30 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
python如何制作缩略图
Apr 30 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
python实现图片插入文字
Nov 26 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
python定义类的简单用法
Jul 24 Python
tensorflow中的数据类型dtype用法说明
May 26 Python
Python的Django框架中自定义模版标签的示例
Jul 20 #Python
详解在Python的Django框架中创建模板库的方法
Jul 20 #Python
简单介绍Python的Django框架加载模版的方式
Jul 20 #Python
在Django框架中编写Context处理器的方法
Jul 20 #Python
详解Django框架中用context来解析模板的方法
Jul 20 #Python
Django中URLconf和include()的协同工作方法
Jul 20 #Python
在Python的Django框架中包装视图函数
Jul 20 #Python
You might like
中国第一家无线电行
2021/03/01 无线电
php5 图片验证码实现代码
2009/12/11 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
使用PHP开发留言板功能
2019/11/19 PHP
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
js实现五星评价功能
2017/03/08 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python实现淘宝秒杀脚本
2020/06/23 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
Python实现手绘图效果实例分享
2020/07/22 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
项目合作意向书范本
2014/04/01 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
自我检讨书范文
2015/01/28 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android