2013-05-02 45 views
12

Tôi gặp sự cố khi tải mẫu django của mình để hiển thị đối tượng timedelta một cách nhất quán. Tôi đã thử sử dụng bộ lọc thời gian trong mẫu của mình, nhưng không có gì được hiển thị khi tôi thực hiện việc này. Các đối tượng timedelta được thể hiện như sau trên trang lỗi nếu tôi sử dụng Khẳng định False:Hiển thị đối tượng timedelta trong mẫu django

time datetime.timedelta(0, 38, 132827) 

này hiển thị sự khác biệt thời gian như:

0: 00: 38,132827

Tôi muốn chỉ hiển thị giờ, phút và giây cho từng đối tượng timedelta. Có ai có bất cứ đề nghị về cách tôi có thể làm điều này?

Trả lời

0

Theo như tôi biết bạn phải viết cho bạn mẫu thẻ riêng cho việc này. Dưới đây là một trong tôi đã pha chế dựa trên Django lõi timesince/code timeuntil rằng nên sản lượng gì bạn đang sau:

@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

Tôi không nghĩ rằng có bất cứ điều gì được xây dựng trong, và timedeltas không trực tiếp tiếp xúc với giá trị giờ và phút của họ. nhưng gói này bao gồm một thẻ lọc timedelta tùy chỉnh có thể giúp: http://pydoc.net/Python/django-timedeltafield/0.6.8/

1

Bạn có thể thử gỡ bỏ micro từ đối tượng timedelta, trước khi gửi nó vào template:

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

Mã chỉ câu trả lời không phải là rất hữu ích cho riêng mình. Nó sẽ giúp ích nếu bạn có thể thêm một số chi tiết giải thích cách thức/tại sao nó trả lời câu hỏi. – SiHa

1

Tôi đi theo Phêrô lời khuyên và viết một bộ lọc mẫu tùy chỉnh.

Đây là các bước tôi đã thực hiện.

Trước tiên, tôi theo dõi guide này để tạo bộ lọc mẫu tùy chỉnh.

Hãy nhớ đọc phần này trên code layout.

Đây là mã bộ lọc của tôi

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 

Sau đó, trong mẫu của tôi, tôi đã làm

{% load smooth_timedelta %} 

{% timedeltaobject|smooth_timedelta %} 

đầu ra Ví dụ

enter image description here

Các vấn đề liên quan