由于Django的模板模板中不支持使用python原生的方法,所以在使用的时候非常不便,例如需要将时间戳转换为日期格式。如果是一条数据,那么可以在views.py中查询之后将时间戳转换后再传输到页面上,但是有多条数据的时候此方法就不太适用了(虽然也可以实现)。为了解决这个不便,Django提供了自定义tag。这里对自定义tag的用法做一个总结。
class TimeToDateNode(template.Node):
def __init__(self, format_string):
self.format_string = format_string
pass
def render(self, context):
#返回的是格式化后的时间表示字符串
timestr = self.format_string.resolve(context, True)
timestr = float(timestr)
ltime = time.localtime(timestr)
return time.strftime("%Y-%m-%d %H:%M:%S",ltime )
@register.tag("time_to_date")
def do_current_time(parser, token):
try:
tag_name, format_string = token.split_contents()
except ValueError:
msg = '%r tag requires a single argument' % token.split_contents()[0]
raise template.TemplateSyntaxError(msg)
format_string = parser.compile_filter(format_string)
return TimeToDateNode(format_string)
在templatetags文件夹中新建一个mytags.py,这段代码便是mytags中的(省去了头部的编码,import以及register = template.Library()等,这里只是核心代码)。
此处新建了一个类叫做TimeToDateNote,继承自template.Node,所有的自定义tags都必须从这个类继承。类中第一个init 方法和第二个render方法是固定的,第三个方法自行命名。
起初在页面上用{% time_to_date 1456127043.0 %}直接做测试是可以正常打印出日期的,但是{% time_to_date key.add_time %}这样用却是一直报错,表示key.addtime并未被识别。查阅大量博客等资料后,添加了倒数第二行的format_string = parser.compile_filter(format_string)
,并且稍稍修改了render方法(主要是添加了timestr = self.format_string.resolve(context, True)
),测试之后竟然OK了,也就是说可以识别key.addtime了,目前至少可以实现想要的功能,且其他需要使用这种方法的地方也可以依样画葫芦了。至于这么做的实现原理以及所有变量是如何一步步被转化的,以后再细细研究吧。。