Django学习随手记(二)

由于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值