在Python的Django框架中编写编译函数

作者:goldensun 时间:2022-01-04 16:53:34 

当遇到一个模板标签(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 子类,返回其它值都是错的。

标签:Django,编译函数
0
投稿

猜你喜欢

  • Pytorch复现扩散模型的示例详解

    2023-08-15 02:12:33
  • Pycharm中配置远程Docker运行环境的教程图解

    2022-08-06 09:39:19
  • 使用python库xlsxwriter库来输出各种xlsx文件的示例

    2022-04-27 14:50:30
  • Python中三种条件语句示例介绍

    2022-09-17 17:28:30
  • Python最长回文子串问题

    2023-10-02 16:13:21
  • python 多线程爬取壁纸网站的示例

    2023-11-14 21:45:30
  • 清除代码异味

    2011-05-21 08:34:00
  • Python线程池thread pool创建使用及实例代码分享

    2022-02-26 00:43:35
  • Python中模块的使用--binascii模块用法

    2022-11-16 13:53:16
  • 删除目录下相同文件的python代码(逐级优化)

    2023-08-02 17:25:10
  • python 读取yaml文件的两种方法(在unittest中使用)

    2021-04-20 17:38:30
  • Python引用类型和值类型的区别与使用解析

    2021-06-18 10:45:59
  • Python logging设置和logger解析

    2021-07-15 22:12:52
  • Golang实现带优先级的select

    2024-04-26 17:36:41
  • python 视频逐帧保存为图片的完整实例

    2022-06-06 20:54:01
  • SQL Server 2005作业设置定时任务

    2024-01-27 13:02:59
  • python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例

    2021-04-26 09:11:26
  • Python中pymysql 模块的使用详解

    2024-01-16 21:07:25
  • 通过python顺序修改文件名字的方法

    2023-05-20 08:05:29
  • js对象基础实例分析

    2023-09-03 12:07:56
  • asp之家 网络编程 m.aspxhome.com