Django создает фильтр шаблонов для приятного времяпрепровождения

Я знаю, что есть timesince фильтр.

Но я хочу что-то, что возвращает это:

  • всего несколько секунд назад
  • Х минут назад
  • X часов назад
  • в $day_name
  • Х недель назад
  • Х месяцев назад

Примеры:

  • всего несколько секунд назад
  • 37 минут назад
  • 2 часа назад
  • вчерашний день
  • в четверг
  • 1 неделю назад
  • 7 месяцев назад

Как я могу реализовать что-то подобное?


person Fred Collins    schedule 31.05.2011    source источник


Ответы (2)


Не уверен, что это отвечает всем вашим требованиям, но в тегах шаблона django.contrib.humanize есть тег naturaltime, который должен делать это:

https://docs.djangoproject.com/en/dev/ref/contrib/humanize/#naturaltime

settings.py

INSTALLED_APPS = {
    ...
    'django.contrib.humanize',
}

template.html

{% load humanize %}
{{ model.timefield|naturaltime }}
person Timmy O'Mahony    schedule 01.06.2011
comment
Круто, я не знал об этом. Это было добавлено после Django 1.3; вам нужно будет получить его из магистрали SVN. - person Brian Neal; 01.06.2011
comment
Круто, Джанго мне нравится все больше и больше ;) - person starcorn; 27.04.2012

Изменить: если вы используете недавнюю проверку Django SVN (сообщение 1.3), см. ответ Pastylegs. В противном случае, вот что вы можете сделать:

Для этой цели я использую repoze.timeago. Код довольно прост, поэтому при необходимости его можно настроить.

Вот пользовательский фильтр Django под названием elapsed, который я создал и использует repoze.timeago.

import datetime
from django import template
import repoze.timeago

register = template.Library()

# If you aren't using UTC time everywhere, this line can be used
# to customize repoze.timeago:
repoze.timeago._NOW = datetime.datetime.now

@register.filter(name='elapsed')
def elapsed(timestamp):
    """
    This filter accepts a datetime and computes an elapsed time from "now".
    The elapsed time is displayed as a "humanized" string.
    Examples:
        1 minute ago
        5 minutes ago
        1 hour ago
        10 hours ago
        1 day ago
        7 days ago

    """
    return repoze.timeago.get_elapsed(timestamp)
elapsed.is_safe = True
person Brian Neal    schedule 31.05.2011