如何在Django模板中使用Humanize显示“x天前”类型时间?

时间:2011-06-27 15:04:55

标签: python django humanize

当我这样做时:

{% load humanize %}

{{ video.pub_date|naturaltime|capfirst }}

我得到2 days, 19 hours ago

如何在没有时间的情况下获得2天。基本上如果视频是在不到一天前发布的,那么它应该在X小时前说出来,那么它应该计算在X天之前的几天,然后是几周。我只是不想1小时5分钟前或2天13分钟前。只是第一部分。

我查看了人性化的文档但找不到我需要的东西。

4 个答案:

答案 0 :(得分:26)

Django a built-in template filter 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]}

答案 1 :(得分:2)

您应该将django.contrib.humanize.templatetags.humanize.py复制到myapp.templatetags.myhumanize并根据需要进行修改。 (我找不到返回“x天,小时前”的实际行。你使用的是哪个版本的django / humanize?)

答案 2 :(得分:1)

答案 3 :(得分:0)

现在,您还可以使用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)