Django学习随手记(二)

来源:互联网 发布:手机淘宝直播怎么看 编辑:程序博客网 时间:2024/06/05 15:01

由于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了,目前至少可以实现想要的功能,且其他需要使用这种方法的地方也可以依样画葫芦了。至于这么做的实现原理以及所有变量是如何一步步被转化的,以后再细细研究吧。。

0 0
原创粉丝点击