2013-05-02 16 views
12

Mam problem z pobieraniem mojego szablonu django, aby konsekwentnie wyświetlać obiekt timedelta. Próbowałem użyć filtra czasu w moim szablonie, ale nic nie jest wyświetlane, gdy to robię. Przedmiotem timedelta przedstawiono następująco na stronie błędy, jeśli mogę użyć Assert fałsz:Wyświetlanie obiektu timedelta w szablonie django

time datetime.timedelta(0, 38, 132827) 

Wyświetla różnicę czasu jako:

0: 00: 38,132827

Chciałbym tylko pokazać godziny, minuty i sekundy dla każdego obiektu timedelta. Czy ktoś ma jakieś sugestie, w jaki sposób mogę to zrobić?

Odpowiedz

0

Z tego co wiem, musisz napisać własną etykietę szablonu. Poniżej znajduje się jeden mam wymyślone na podstawie Django rdzeń timesince/code timeuntil które powinny wyjście co jesteś po:

@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' 
1

Można spróbować usunąć mikrosekund od obiektu timedelta, przed wysłaniem go do szablonu:

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

Kod tylko odpowiedzi nie są bardzo przydatne na własną rękę. Pomogłoby to w dodaniu szczegółów wyjaśniających, jak/dlaczego odpowiada na pytanie. – SiHa

1

Śledziłem Piotra doradztwo i napisał niestandardowy filtr szablonów.

Oto kroki, które podjąłem.

Najpierw poszedłem za tym guide, aby utworzyć niestandardowy filtr szablonów.

Należy przeczytać ten rozdział na temat code layout.

Oto mój kod filtr

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 

Wtedy w moim szablonu zrobiłem

{% load smooth_timedelta %} 

{% timedeltaobject|smooth_timedelta %} 

Przykâadowa

enter image description here

Powiązane problemy