在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使用filetype精确判断文件类型
Jul 02 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
pandas对指定列进行填充的方法
Apr 11 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
Python进阶之@property动态属性的实现
Apr 01 Python
用Python识别人脸,人种等各种信息
Jul 15 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
Python模拟键盘输入自动登录TGP
Nov 27 Python
python中uuid模块实例浅析
Dec 29 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 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 foreach、while性能比较
2009/10/15 PHP
PHP开发中四种查询返回结果分析
2011/01/02 PHP
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
总结对比php中的多种序列化
2016/08/28 PHP
Javascript函数的参数
2015/07/16 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
如何利用python读取micaps文件详解
2020/10/18 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
会计电算化应届生求职信
2013/11/03 职场文书
业务经理岗位职责
2013/11/11 职场文书
护士辞职信范文
2014/01/19 职场文书
乳制品整治工作方案
2014/05/29 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
金砖之国观后感
2015/06/11 职场文书