-->

Display and format Django DurationField in templat

2020-08-13 05:38发布

问题:

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

回答1:

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)


回答2:

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)


回答3:

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}'