我無法讓我的Django模板一致地顯示timedelta對象。我嘗試在我的模板中使用時間過濾器,但是當我這樣做時沒有顯示任何內容。該timedelta對象表示如果我使用斷言虛假的錯誤頁面,如下所示:在Django模板中顯示timedelta對象
time datetime.timedelta(0, 38, 132827)
這將顯示的時間差爲:
0:00:38.132827
我想只顯示每個timedelta對象的小時,分鍾和秒。有沒有人對我如何做到這一點有任何建議?
我無法讓我的Django模板一致地顯示timedelta對象。我嘗試在我的模板中使用時間過濾器,但是當我這樣做時沒有顯示任何內容。該timedelta對象表示如果我使用斷言虛假的錯誤頁面,如下所示:在Django模板中顯示timedelta對象
time datetime.timedelta(0, 38, 132827)
這將顯示的時間差爲:
0:00:38.132827
我想只顯示每個timedelta對象的小時,分鍾和秒。有沒有人對我如何做到這一點有任何建議?
據我所知,你必須寫你自己的模板標籤。下面是一個我基於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'
我不認爲有建於什麼,timedeltas不直接暴露他們的小時和分鐘值。但這個包包括timedelta自定義過濾器標籤,可以幫助: http://pydoc.net/Python/django-timedeltafield/0.6.8/
你可以嘗試從timedelta對象中刪除微秒,將其發送到模板之前:
time = time - datetime.timedelta(microseconds=time.microseconds)
from datetime import datetime
start = datetime.now()
taken = datetime.now() - start
str(taken)
'0:03:08.243773'
str(taken).split('.')[0]
'0:03:08'
我跟彼得建議並編寫了自定義模板過濾器。
這是我採取的步驟。
首先我跟着這個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 %}
我的過濾代碼示例輸出
代碼只有答案沒有對自己非常有用的。如果你可以添加一些細節來解釋如何/爲什麼它會回答這個問題,這將有所幫助。 – SiHa 2016-09-29 11:53:33