在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 相关文章推荐
python3 模拟登录v2ex实例讲解
Jul 13 Python
Python列表和元组的定义与使用操作示例
Jul 26 Python
python线程中同步锁详解
Apr 27 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
python打包成so文件过程解析
Sep 28 Python
python 实现图片批量压缩的示例
Dec 18 Python
python 如何在 Matplotlib 中绘制垂直线
Apr 02 Python
Python爬取某拍短视频
Jun 11 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生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
twig里使用js变量的方法
2016/02/05 PHP
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
jQuery动态添加
2016/04/07 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
python获取当前日期和时间的方法
2015/04/30 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
西部世纪面试题
2014/12/05 面试题
实习生的自我评价
2014/01/08 职场文书
家长给老师的道歉信
2014/01/13 职场文书
英语感恩演讲稿
2014/01/14 职场文书
军训教官感言
2014/03/02 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
单位授权委托书范本
2014/09/26 职场文书
2014年教研员工作总结
2014/12/23 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书