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

发布于 2024-11-17 03:49:57 字数 293 浏览 4 评论 0原文

当我这样做时:

{% load humanize %}

{{ video.pub_date|naturaltime|capfirst }}

我得到2天,19小时前

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

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

When I do this:

{% load humanize %}

{{ video.pub_date|naturaltime|capfirst }}

I get 2 days, 19 hours ago

How can I get just 2 days without the hours. Basically if the video was published in less than a day ago then it should say X hours ago, then it should count in days like X days ago, then in weeks. I just don't want 1 hours 5 minutes ago or 2 days 13 minutes ago. Just the first part.

I looked at the humanize docs but couldn't find what I needed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我偏爱纯白色 2024-11-24 03:49:57

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 has a built-in template filter timesince that offers the same output you mentioned above. The following filter just strips the second part after the comma:

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]}
岁月静好 2024-11-24 03:49:57

现代 django 中有 naturaltime

给定的现在2007年2月17日16:30:00

它将 16 Feb 2007 13:31:29 更改为 1 天 2 小时前

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

https://docs.djangoproject.com/en/2.2/ref /contrib/人性化/#naturaltime

There is naturaltime in modern django.

Given now is 17 Feb 2007 16:30:00.

It changes 16 Feb 2007 13:31:29 to 1 day, 2 hours ago.

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

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

未央 2024-11-24 03:49:57

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

You should duplicate your django.contrib.humanize.templatetags.humanize.py to myapp.templatetags.myhumanize and modify it to your needs. (I can't find the actual line that returns "x days, y hours ago". Which version of django/humanize are you using?)

童话 2024-11-24 03:49:57

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

You can also now use an ExpressionWrapper or Case/When that will utilize the queryset and database to format it directly.

Example output, in combo with day/days pluralized off the top of my head:

overdue = ExpressionWrapper(timezone.now() - F('due_date'), output_field=fields.DurationField())
objects = Activity.objects.all().order_by('-due_date').annotate(overdue=overdue)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文