Формат фильтра 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