有没有办法使用{{date|timesince}}
过滤器,但不是只有两个相邻的单位,只显示一个?
例如,我的模板目前显示“18小时16分钟”。我怎么能让它显示“18小时”? (Rounding在这里不是问题。)谢谢。
答案 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