2013-05-02 4 views
12

У меня возникли проблемы с созданием шаблона django для отображения объекта timedelta. Я попытался использовать фильтр времени в своем шаблоне, но ничего не отображается, когда я это делаю. Объект timedelta отображается следующим образом на странице ошибки, если я использую Утверждают Ложные:Отображение объекта timedelta в шаблоне django

time datetime.timedelta(0, 38, 132827) 

Это показывает разницу во времени как:

0: 00: 38,132827

Я хотел бы только показать часы, минуты и секунды для каждого объекта timedelta. Есть ли у кого-нибудь какие-либо предложения о том, как я могу это сделать?

ответ

0

Насколько я знаю, вы должны написать свой собственный тег шаблона для этого. Ниже один я состряпал на основе 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' 
2

Я не думаю, что есть что-нибудь построен в, и timedeltas непосредственно не подвергать их значения часов и минут. но этот пакет включает в себя timedelta пользовательского фильтра тега, который может помочь: http://pydoc.net/Python/django-timedeltafield/0.6.8/

1

Вы можете попробовать удалить микросекунды от объекта timedelta, прежде чем отправить его в шаблон:

time = time - datetime.timedelta(microseconds=time.microseconds) 
0
from datetime import datetime 

start = datetime.now() 

taken = datetime.now() - start 

str(taken) 

'0:03:08.243773' 

str(taken).split('.')[0] 

'0:03:08' 
+1

код только ответы не очень полезны сами по себе. Это поможет, если вы можете добавить некоторые детали, объясняющие, как/почему он отвечает на вопрос. – SiHa

1

я последовал за Питер советы и написал собственный фильтр шаблонов.

Вот шаги, которые я предпринял.

Сначала я следил за этим 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 %} 

Пример вывода

enter image description here

Смежные вопросы