Отображение объекта timedelta в шаблоне django
У меня возникли проблемы с получением моего шаблона django для непрерывного отображения объекта timedelta. Я попытался использовать фильтр времени в своем шаблоне, но ничего не отображается, когда я это делаю. Объект timedelta показан на странице ошибок, если я использую Assert False:
time datetime.timedelta(0, 38, 132827)
Отображает разницу во времени как:
0: 00: 38,132827
Я хотел бы показывать только часы, минуты и секунды для каждого объекта timedelta. У кого-нибудь есть предложения о том, как я могу это сделать?
Ответы
Ответ 1
Я последовал совету Питера и написал собственный шаблонный фильтр.
Вот шаги, которые я предпринял.
Сначала я следовал этому руководству, чтобы создать собственный шаблонный фильтр.
Обязательно прочтите этот раздел по макету кода.
Вот мой код фильтра
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]()
Ответ 2
Я не думаю, что там что-то встроено, и timedeltas напрямую не выставляет свои значения часов и минут. но этот пакет включает тег пользовательского фильтра timedelta, который может помочь:http://pydoc.net/django-timedeltafield/0.7.10/
Ответ 3
Вы можете попробовать удалить микросекунды из объекта timedelta, прежде чем отправлять его в шаблон:
time = time - datetime.timedelta(microseconds=time.microseconds)
Ответ 4
Насколько я знаю, вы должны написать свой собственный тег шаблона для этого. Ниже приведено то, что я придумал на основе кода ядра timetime/timetimeil от Django, который должен выводить то, что вам нужно:
@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'
Ответ 5
from datetime import datetime
start = datetime.now()
taken = datetime.now() - start
str(taken)
'0:03:08.243773'
str(taken).split('.')[0]
'0:03:08'