2013-05-02 157 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