我无法让我的django模板一致地显示timedelta对象。我尝试在模板中使用时间过滤器,但是当我这样做时没有显示任何内容。如果我使用Assert False,则timedelta对象在错误页面上显示如下:
time datetime.timedelta(0, 38, 132827)
这会将时差显示为:
0:00:38.132827
我想只显示每个timedelta对象的小时,分钟和秒。有没有人对我如何做到这一点有任何建议?
答案 0 :(得分:5)
我遵循彼得的建议并编写了一个自定义模板过滤器。
这是我采取的步骤。
首先,我按照此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 %}
示例输出
答案 1 :(得分:2)
我认为没有内置任何内容,timedeltas不直接暴露他们的小时和分钟值。但是这个软件包包含一个timedelta自定义过滤器标签,可能有助于: http://pydoc.net/Python/django-timedeltafield/0.6.8/
答案 2 :(得分:2)
您可以尝试从timedelta对象中删除微秒,然后再将其发送到模板:
time = time - datetime.timedelta(microseconds=time.microseconds)
答案 3 :(得分:0)
据我所知,你必须为此编写自己的模板标签。下面是我基于Django核心timeince / 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'
答案 4 :(得分:0)
编写自己的自定义模板标签的建议是正确的方法100%。您将拥有完全的控制权,并且可以随意设置其格式。但是-如果您懒惰并且想要使用内置的django工具快速解决方案,则可以使用内置的timesince标签使用hackey技术。
基本上,从当前时间中减去时间增量,并将其放入模板中。例如
import datetime
import django.template
tdelta = datetime.timedelta(hours=5, minutes=10)
tm = datetime.datetime.utcnow() - tdelta
django_engine = django.template.engines['django']
template = django_engine.from_string("My delta {{ tm|timesince }}")
print(template.render({'tm': tm})
在./manage.py shell
中执行以上代码,输出为:
My delta 5 hours, 10 minutes
答案 5 :(得分:-1)
from datetime import datetime
start = datetime.now()
taken = datetime.now() - start
str(taken)
'0:03:08.243773'
str(taken).split('.')[0]
'0:03:08'