当我这样做时:
{% load humanize %}
{{ video.pub_date|naturaltime|capfirst }}
我明白了2 days, 19 hours ago
如果没有时间,我怎么能得到 2 天。基本上,如果视频是在不到一天前发布的,那么它应该说是 X 小时前,那么它应该以 X 天前的天数为单位,然后以几周为单位。我只是不想要 1 小时 5 分钟前或 2 天 13 分钟前。只是第一部分。
我查看了人性化文档,但找不到我需要的东西。
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]}
您应该将django.contrib.humanize.templatetags.humanize.py复制到 myapp.templatetags.myhumanize 并根据您的需要进行修改。(我找不到返回“x 天,y 小时前”的实际行。您使用的是哪个版本的 django/humanize?)
现代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
您现在还可以使用 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)