在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中的urllib2模块
Nov 13 Python
python实现中文转换url编码的方法
Jun 14 Python
分享python数据统计的一些小技巧
Jul 21 Python
Python学习小技巧之利用字典的默认行为
May 20 Python
python2 与python3的print区别小结
Jan 16 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
Selenium控制浏览器常见操作示例
Aug 13 Python
Django集成CAS单点登录的方法示例
Jun 10 Python
基于python3的socket聊天编程
Feb 17 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
Python编写memcached启动脚本代码实例
Aug 14 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函数学习之PHP函数点评
2012/07/05 PHP
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
Prototype Array对象 学习
2009/07/19 Javascript
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
分页栏的web标准实现
2011/11/01 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
Vue组件化开发思考
2018/02/02 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
Python 字符串中的字符倒转
2008/09/06 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
大学生新学期计划书
2014/04/28 职场文书
领导党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年团工作总结
2014/11/27 职场文书
邀请函范文
2015/02/02 职场文书
大学生求职自荐信
2015/03/24 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
少先队入队仪式主持词
2015/07/04 职场文书