Формат фильтра timesince
есть ли способ, чтобы использовать {{date|timesince}}
фильтр, но вместо того, чтобы иметь два соседних блока, отображать только один?
например, мой шаблон в настоящее время отображает "18 часов, 16 минут". Как я могу заставить его отображать "18 часов"? (Округление здесь не является проблемой.) Спасибо тебе.
3 ответов
Я не могу придумать простой встроенный способ сделать это. Вот пользовательский фильтр, который я иногда находил полезным:
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:',' }}
С timesince фильтр не принимает никаких аргументов, вам придется вручную снять часы с вашей даты.
здесь пользовательский шаблон фильтра вы можете использовать для удаления минут, секунд и микросекунд из объекта datetime:
#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 для загрузки тегов, а затем вы можете использовать вышеуказанный фильтр, как показано в документации выше.
быстрый и грязный способ:
изменить исходный файл 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