在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 相关文章推荐
简介Django框架中可使用的各类缓存
Jul 23 Python
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
python删除不需要的python文件方法
Apr 24 Python
对python中的logger模块全面讲解
Apr 28 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
python基于SMTP协议发送邮件
May 31 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
在python中求分布函数相关的包实例
Apr 15 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
写一个Python脚本自动爬取Bilibili小视频
Apr 24 Python
Python创建SQL数据库流程逐步讲解
Sep 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连接数据库代码应用分析
2011/05/29 PHP
PHP整合PayPal支付
2015/06/11 PHP
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
JS实现的Unicode编码转换操作示例
2017/04/28 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
原生JS实现轮播图效果
2018/10/12 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
使用Python写个小监控
2016/01/27 Python
Python实现的计数排序算法示例
2017/11/29 Python
快速查询Python文档方法分享
2017/12/27 Python
TensorFlow利用saver保存和提取参数的实例
2018/07/26 Python
python实现扫雷小游戏
2020/04/24 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
夏季奶茶店创业计划书
2014/01/16 职场文书
表决心的诗句大全
2014/03/11 职场文书
环保倡议书
2014/04/14 职场文书
热门专业求职信
2014/05/24 职场文书
2014年党员学习“三严三实”思想汇报
2014/09/15 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
python高温预警数据获取实例
2022/07/23 Python