在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 相关文章推荐
Python 实现一行输入多个值的方法
Apr 21 Python
Python爬虫信息输入及页面的切换方法
May 11 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
python实现彩票系统
Jun 28 Python
python程序封装为win32服务的方法
Mar 07 Python
Python正则表达式匹配日期与时间的方法
Jul 07 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 Python
用python对oracle进行简单性能测试
Dec 05 Python
Python 打印自己设计的字体的实例讲解
Jan 04 Python
Matlab如何实现矩阵复制扩充
Jun 02 Python
Python 中random 库的详细使用
Jun 03 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
PHP-MySQL教程归纳总结
2008/06/07 PHP
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php xml文件操作代码(一)
2009/03/20 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
php实现socket推送技术的示例
2017/12/20 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
js a标签点击事件
2017/03/30 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
小米5s微信跳一跳小程序python源码
2018/01/08 Python
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
我的大学生活职业生涯规划
2014/01/02 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
班级课外活动总结
2014/07/09 职场文书
付款证明格式范文
2015/06/19 职场文书
运动会主持词大全
2015/07/02 职场文书
争做文明公民倡议书
2019/06/24 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL