在Django中编写模版节点及注册标签的方法
编写模板节点
编写自定义标签的第二步就是定义一个拥有render()方法的Node子类。继续前面的例子,我们需要定义CurrentTimeNode:
importdatetime classCurrentTimeNode(template.Node): def__init__(self,format_string): self.format_string=str(format_string) defrender(self,context): now=datetime.datetime.now() returnnow.strftime(self.format_string)
这两个函数(__init__()和render())与模板处理中的两步(编译与渲染)直接对应。这样,初始化函数仅仅需要存储后面要用到的格式字符串,而render()函数才做真正的工作。
与模板过滤器一样,这些渲染函数应该静静地捕获错误,而不是抛出错误。模板标签只允许在编译的时候抛出错误。
注册标签
最后,你需要用你模块的Library实例注册这个标签。注册自定义标签与注册自定义过滤器非常类似(如前文所述)。只需实例化一个template.Library实例然后调用它的tag()方法。例如:
register.tag('current_time',do_current_time)
tag()方法需要两个参数:
- 模板标签的名字(字符串)。
- 编译函数。
和注册过滤器类似,也可以在Python2.4及其以上版本中使用register.tag装饰器:
@register.tag(name="current_time") defdo_current_time(parser,token): #... @register.tag defshout(parser,token): #...
如果你像在第二个例子中那样忽略name参数的话,Django会使用函数名称作为标签名称。