在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 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
tornado捕获和处理404错误的方法
Feb 26 Python
从零学Python之入门(四)运算
May 27 Python
python使用any判断一个对象是否为空的方法
Nov 19 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
Python实现求一个集合所有子集的示例
May 04 Python
python实现超简单的视频对象提取功能
Jun 04 Python
Python基于OpenCV实现人脸检测并保存
Jul 23 Python
python实现在线翻译功能
Mar 03 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
call在Python中改进数列的实例讲解
Dec 09 Python
使用pd.merge表连接出现多余行的问题解决
Jun 16 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中常用编辑器推荐
2007/01/02 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
JavaScript 应用技巧集合[推荐]
2009/08/30 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
vue2.0全局组件之pdf详解
2017/06/26 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
python动态监控日志内容的示例
2014/02/16 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
django的settings中设置中文支持的实现
2019/04/28 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
军人违纪检讨书
2014/02/04 职场文书
机关搬迁方案
2014/05/18 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
Python 阶乘详解
2021/10/05 Python
Vue的过滤器你真了解吗
2022/02/24 Vue.js