2013-05-02 13 views
12

Sto avendo difficoltà a raggiungere il mio modello Django per visualizzare un oggetto timedelta coerente. Ho provato a utilizzare il filtro del tempo nel mio modello, ma non viene visualizzato nulla quando lo faccio. L'oggetto timedelta viene visualizzato come segue nella pagina di errori se uso assert false:Visualizzazione di un oggetto timedelta in un modello di Django

time datetime.timedelta(0, 38, 132827) 

Questo visualizza la differenza di tempo come:

0: 00: 38,132827

Vorrei solo spettacolo le ore, i minuti e i secondi per ciascun oggetto timedelta. Qualcuno ha qualche suggerimento su come posso farlo?

risposta

0

Per quanto ne so si deve scrivere sei proprio tag modello per questo. Qui di seguito è quello che ho inventato basato sul core timesince/code timeuntil Django che dovrebbe uscita quello che stai dopo:

@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

non credo che ci sia qualcosa di costruito in, e timedeltas non esporre direttamente i loro valori di ora e minuto. ma questo pacchetto include un tag di filtro timedelta personalizzato che potrebbe aiutare: http://pydoc.net/Python/django-timedeltafield/0.6.8/

1

Si può provare rimuovere le microsecondi dall'oggetto timedelta, prima di inviarlo al modello:

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

codice solo risposte non sono molto utili per conto proprio. Sarebbe d'aiuto se potessi aggiungere qualche dettaglio che spieghi come/perché risponde alla domanda. – SiHa

1

ho seguito Pietro consiglio e ha scritto un filtro modello personalizzato.

Ecco i passaggi che ho svolto.

Prima Ho seguito questo guide per creare un filtro modello personalizzato.

Assicurarsi di leggere questa sezione sulla code layout.

Ecco il mio codice filtro

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 

Poi nel mio modello ho fatto

{% load smooth_timedelta %} 

{% timedeltaobject|smooth_timedelta %} 

uscita Esempio

enter image description here

Problemi correlati