在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实现用户登录系统
May 21 Python
python 从文件夹抽取图片另存的方法
Dec 04 Python
详解python的四种内置数据结构
Mar 19 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
pytorch方法测试详解——归一化(BatchNorm2d)
Jan 15 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
python读取文件指定行内容实例讲解
Mar 02 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 Python
Pytorch之扩充tensor的操作
Mar 04 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截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP时间处理类操作示例
2018/09/05 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
从Python程序中访问Java类的简单示例
2015/04/20 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
python可视化text()函数使用详解
2020/02/11 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
python中加背景音乐如何操作
2020/07/19 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
售后服务科岗位职责范文
2013/11/13 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
中学生自我评价范文
2015/03/03 职场文书