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

19

当我执行这个操作时:

{% load humanize %}

{{ video.pub_date|naturaltime|capfirst }}

我得到了2天,19小时前

如何只获取2天而不是小时。如果视频发布时间少于一天,则应显示X小时前,然后应计算为X天前,然后是几周前。我只需要第一部分。 我查看了humanize文档,但找不到我需要的内容。

4个回答

33

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]}

3

这并不提供X天前的日期,只有“今天”,“昨天”等。 - alias51
1
我只是想说意识到 Django 中内置的 naturaltime 很不错。像 humanize 一样,它将 16 Feb 2007 13:31:29 计算为 1 天,2 小时前 - Harry Moreno

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

3
我建议不要复制代码并进行修改,因为这样可能会导致在更新版本中出现问题。 - Darioush

0
你现在也可以使用ExpressionWrapper或Case/When,它将利用queryset和数据库直接格式化它。
例如输出,与我脑海中的day/days复数形式组合:
overdue = ExpressionWrapper(timezone.now() - F('due_date'), output_field=fields.DurationField())
objects = Activity.objects.all().order_by('-due_date').annotate(overdue=overdue)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接