Im using Django 1.8, and i have one of my field defined as DurationField, but i dont find any way to correctly display it on my template, if i output it like this:
{{runtime}}
i just get 0:00:00.007980
is there any filter or any other way of displaying something more like
2hours 30 min
No, I don't think there is any built in filter to format a timedelta
, it should be fairly easy to write one yourself though.
Here is a basic (and untested) example:
from django import template
register = template.Library()
@register.filter
def duration(td):
total_seconds = int(td.total_seconds())
hours = total_seconds // 3600
minutes = (total_seconds % 3600) // 60
return '{} hours {} min'.format(hours, minutes)
This is the one I use, it rounds minutes and display only the information needed :
@register.filter
def duration(timedelta):
""" Format a duration field --> 2h and 30 min or only 45 min """
total_seconds = int(timedelta.total_seconds())
hours = total_seconds // 3600
minutes = round((total_seconds % 3600) / 60)
if minutes == 60:
hours += 1
minutes = 0
if hours and minutes:
# Display both
return '{}h et {} min'.format(hours, minutes)
elif hours:
# Display only hours
return '{}h'.format(hours)
# Display only minutes
return '{} min'.format(minutes)
Contribution for Aumo answer:
from django import template
register = template.Library()
@register.filter
def duration(td):
total_seconds = int(td.total_seconds())
days = total_seconds // 86400
remaining_hours = total_seconds % 86400
remaining_minutes = remaining_hours % 3600
hours = remaining_hours // 3600
minutes = remaining_minutes // 60
seconds = remaining_minutes % 60
days_str = f'{days}d ' if days else ''
hours_str = f'{hours}h ' if hours else ''
minutes_str = f'{minutes}m ' if minutes else ''
seconds_str = f'{seconds}s' if seconds and not hours_str else ''
return f'{days_str}{hours_str}{minutes_str}{seconds_str}'