【问题标题】:How to display "x days ago" type time using Humanize in Django template?如何在 Django 模板中使用 Humanize 显示“x 天前”类型时间?
【发布时间】:2011-09-23 14:35:05
【问题描述】:

当我这样做时:

{% load humanize %}

{{ video.pub_date|naturaltime|capfirst }}

我收到2 days, 19 hours ago

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

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

【问题讨论】:

    标签: python django humanize


    【解决方案1】:

    现代django中有naturaltime

    给定now17 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

    【讨论】:

    • 这不提供 X 天前,只提供“今天”、“昨天”等
    • 我只是说很高兴知道 naturaltime 内置在 django 中。像 humanize 它计算 16 Feb 2007 13:31:29 -> 1 day, 2 hours ago.
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我建议不要复制和修改代码。这可能会破坏新版本的内容。
        猜你喜欢
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 2012-05-29
        • 2019-10-09
        相关资源
        最近更新 更多