2013-05-02 521 views
12

我无法让我的Django模板一致地显示timedelta对象。我尝试在我的模板中使用时间过滤器,但是当我这样做时没有显示任何内容。该timedelta对象表示如果我使用断言虚假的错误页面,如下所示:在Django模板中显示timedelta对象

time datetime.timedelta(0, 38, 132827) 

这将显示的时间差为:

0:00:38.132827

我想只显示每个timedelta对象的小时,分​​钟和秒。有没有人对我如何做到这一点有任何建议?

回答

0

据我所知,你必须写你自己的模板标签。下面是一个我基于Django的核心timesince/timeuntil代码应该输出你以后炮制:

@register.simple_tag 
def duration(duration): 
""" 
Usage: {% duration timedelta %} 
Returns seconds duration as weeks, days, hours, minutes, seconds 
Based on core timesince/timeuntil 
""" 

    def seconds_in_units(seconds): 
    """ 
    Returns a tuple containing the most appropriate unit for the 
    number of seconds supplied and the value in that units form. 

    >>> seconds_in_units(7700) 
    (2, 'hour') 
    """ 

     unit_totals = OrderedDict() 

     unit_limits = [ 
         ("week", 7 * 24 * 3600), 
         ("day", 24 * 3600), 
         ("hour", 3600), 
         ("minute", 60), 
         ("second", 1) 
         ] 

     for unit_name, limit in unit_limits: 
      if seconds >= limit: 
       amount = int(float(seconds)/limit) 
       if amount != 1: 
        unit_name += 's' # dodgy pluralisation 
       unit_totals[unit_name] = amount 
       seconds = seconds - (amount * limit) 

     return unit_totals; 


if duration: 
    if isinstance(duration, datetime.timedelta): 
     if duration.total_seconds > 0: 
      unit_totals = seconds_in_units(duration.total_seconds()) 
      return ', '.join([str(v)+" "+str(k) for (k,v) in unit_totals.iteritems()]) 

return 'None' 
1

你可以尝试从timedelta对象中删除微秒,将其发送到模板之前:

time = time - datetime.timedelta(microseconds=time.microseconds) 
0
from datetime import datetime 

start = datetime.now() 

taken = datetime.now() - start 

str(taken) 

'0:03:08.243773' 

str(taken).split('.')[0] 

'0:03:08' 
+1

代码只有答案没有对自己非常有用的。如果你可以添加一些细节来解释如何/为什么它会回答这个问题,这将有所帮助。 – SiHa 2016-09-29 11:53:33

1

我跟彼得建议并编写了自定义模板过滤器。

这是我采取的步骤。

首先我跟着这个guide来创建一个自定义模板过滤器。请致电code layout

这里的

from django import template 

register = template.Library() 

@register.filter() 
def smooth_timedelta(timedeltaobj): 
    """Convert a datetime.timedelta object into Days, Hours, Minutes, Seconds.""" 
    secs = timedeltaobj.total_seconds() 
    timetot = "" 
    if secs > 86400: # 60sec * 60min * 24hrs 
     days = secs // 86400 
     timetot += "{} days".format(int(days)) 
     secs = secs - days*86400 

    if secs > 3600: 
     hrs = secs // 3600 
     timetot += " {} hours".format(int(hrs)) 
     secs = secs - hrs*3600 

    if secs > 60: 
     mins = secs // 60 
     timetot += " {} minutes".format(int(mins)) 
     secs = secs - mins*60 

    if secs > 0: 
     timetot += " {} seconds".format(int(secs)) 
    return timetot 

然后在我的模板,我做

{% load smooth_timedelta %} 

{% timedeltaobject|smooth_timedelta %} 

我的过滤代码示例输出

enter image description here