Как отобразить время типа «x дней назад» с использованием Humanize в шаблоне Django? - PullRequest
14 голосов
/ 27 июня 2011

Когда я делаю это:

{% load humanize %}

{{ video.pub_date|naturaltime|capfirst }}

Я получаю 2 days, 19 hours ago

Как я могу получить всего 2 дня без часов.По сути, если видео было опубликовано менее суток назад, тогда оно должно было бы указывать X часов назад, тогда оно должно рассчитываться в таких днях, как X дней назад, а затем в неделях.Я просто не хочу 1 час 5 минут назад или 2 дня 13 минут назад.Просто первая часть.

Я посмотрел на гуманизированные документы, но не смог найти то, что мне нужно.

Ответы [ 3 ]

26 голосов
/ 27 июня 2011

Django имеет встроенный шаблонный фильтр timesince, который предлагает тот же вывод, который вы упомянули выше.Следующий фильтр просто удаляет вторую часть после запятой:

from datetime import datetime, timedelta
from django import template
from django.utils.timesince import timesince

register = template.Library()

@register.filter
def age(value):
    now = datetime.now()
    try:
        difference = now - value
    except:
        return value

    if difference <= timedelta(minutes=1):
        return 'just now'
    return '%(time)s ago' % {'time': timesince(value).split(', ')[0]}
2 голосов
/ 27 июня 2011

Вы должны скопировать свой django.contrib.humanize.templatetags.humanize.py в myapp.templatetags.myhumanize и изменить его в соответствии со своими потребностями. (Я не могу найти фактическую строку, которая возвращает «x days, y hours ago». Какую версию django / humanize вы используете?)

0 голосов
/ 25 июня 2016

Теперь вы также можете использовать ExpressionWrapper или Case / When, который будет использовать набор запросов и базу данных для непосредственного форматирования.

Пример вывода в комбинации со днями / днями, множественными от верха моей головы:

overdue = ExpressionWrapper(timezone.now() - F('due_date'), output_field=fields.DurationField())
objects = Activity.objects.all().order_by('-due_date').annotate(overdue=overdue)
...