19

当我这样做时:

{% load humanize %}

{{ video.pub_date|naturaltime|capfirst }}

我明白了2 days, 19 hours ago

如果没有时间,我怎么能得到 2 天。基本上,如果视频是在不到一天前发布的,那么它应该说是 X 小时前,那么它应该以 X 天前的天数为单位,然后以几周为单位。我只是不想要 1 小时 5 分钟前或 2 天 13 分钟前。只是第一部分。

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

4

4 回答 4

31

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]}
于 2011-06-27T15:32:23.973 回答
2

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

于 2011-06-27T15:22:55.713 回答
2

现代django中有naturaltime

给定now的是17 Feb 2007 16:30:00

16 Feb 2007 13:31:29变为1 day, 2 hours ago

{# some_template.html #}
{% load humanize %}
{{ past_time | naturaltime }}

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

于 2019-09-27T01:54:16.527 回答
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)
于 2016-06-25T04:18:15.523 回答