过滤时间的格式

时间:2011-06-26 02:29:25

标签: django django-templates

有没有办法使用{{date|timesince}}过滤器,但不是只有两个相邻的单位,只显示一个?

例如,我的模板目前显示“18小时16分钟”。我怎么能让它显示“18小时”? (Rounding在这里不是问题。)谢谢。

3 个答案:

答案 0 :(得分:25)

我想不出一个简单的内置方法来做到这一点。这是我有时觉得有用的自定义过滤器:

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def upto(value, delimiter=None):
    return value.split(delimiter)[0]
upto.is_safe = True

然后你可以做

{{ date|timesince|upto:',' }}

答案 1 :(得分:5)

由于timesince过滤器不接受任何参数,因此您必须手动剥离日期中的小时数。

这是一个custom template filter,您可以用它来清除日期时间对象的分钟,秒和微秒:

#this should be at the top of your custom template tags file
from django.template import Library, Node, TemplateSyntaxError
register = Library()

#custom template filter - place this in your custom template tags file
@register.filter
def only_hours(value):
    """
    Filter - removes the minutes, seconds, and milliseconds from a datetime

    Example usage in template:

    {{ my_datetime|only_hours|timesince }}

    This would show the hours in my_datetime without showing the minutes or seconds.
    """
    #replace returns a new object instead of modifying in place
    return value.replace(minute=0, second=0, microsecond=0)

如果之前没有使用自定义模板过滤器或标记,则需要在django应用程序中创建一个目录(即与models.py和views.py在同一级别),名为templatetags,并在其中创建一个名为__init__.py的文件(这是一个标准的python模块)。

然后,在其中创建一个python源文件,例如my_tags.py,并将上面的示例代码粘贴到其中。在您的视图中,使用{% load my_tags %}让Django加载您的标记,然后您可以使用上面的过滤器,如上面的文档所示。

答案 2 :(得分:-3)

快速而肮脏的方式:

更改django源文件$ PYTHON_PATH / django / utils / timesince.py @ line51(django1.7):

result = avoid_wrapping(name % count)
return result  #add this line let timesince return here
if i + 1 < len(TIMESINCE_CHUNKS):
    # Now get the second item
    seconds2, name2 = TIMESINCE_CHUNKS[i + 1]
    count2 = (since - (seconds * count)) // seconds2
    if count2 != 0:
        result += ugettext(', ') + avoid_wrapping(name2 % count2)
return result