Как отобразить время типа "x дней назад", используя Humanize в шаблоне Django?
Когда я это сделаю:
{% load humanize %}
{{ video.pub_date|naturaltime|capfirst }}
Я получаю 2 days, 19 hours ago
Как я могу получить всего 2 дня без часов. В принципе, если видео было опубликовано менее чем за день назад, тогда он должен сказать X часов назад, то он должен засчитываться в днях, как X дней назад, а затем в неделях. Я просто не хочу 1 часа 5 минут назад или 2 дня 13 минут назад. Только первая часть.
Я посмотрел документы о гуманизации, но не смог найти то, что мне нужно.
Ответы
Ответ 1
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
Вы должны дублировать django.contrib.humanize.templatetags.humanize.py в myapp.templatetags.myhumanize и модифицировать его в соответствии с вашими потребностями. (Я не могу найти фактическую строку, которая возвращает "x days, y hours ago". Какую версию django/humanize вы используете?)
Ответ 3
Теперь вы также можете использовать 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)
Ответ 4
в современном джанго есть naturaltime
. https://docs.djangoproject.com/en/2.2/ref/contrib/humanize/#naturaltime