Django 创建友好的时间模板过滤器

7 投票
2 回答
3786 浏览
提问于 2025-04-16 18:43

我知道有一个叫做 timesince 的过滤器。

但是我想要的是能返回以下内容的东西:

  • 刚刚几秒钟前
  • X分钟前
  • X小时前
  • 在$星期几
  • X周前
  • X个月前

举个例子:

  • 刚刚几秒钟前
  • 37分钟前
  • 2小时前
  • 昨天
  • 在星期四
  • 1周前
  • 7个月前

我该如何实现这样的功能呢?

2 个回答

4

编辑:如果你使用的是最近的Django SVN版本(1.3之后),可以参考Pastylegs的回答。否则,你可以按照下面的方法操作:

我使用了repoze.timeago来实现这个功能。这个代码相对简单,所以如果需要的话,你可以根据自己的需求进行修改。

这里有一个我创建的Django自定义过滤器,叫做elapsed,它使用了repoze.timeago。

import datetime
from django import template
import repoze.timeago

register = template.Library()

# If you aren't using UTC time everywhere, this line can be used
# to customize repoze.timeago:
repoze.timeago._NOW = datetime.datetime.now

@register.filter(name='elapsed')
def elapsed(timestamp):
    """
    This filter accepts a datetime and computes an elapsed time from "now".
    The elapsed time is displayed as a "humanized" string.
    Examples:
        1 minute ago
        5 minutes ago
        1 hour ago
        10 hours ago
        1 day ago
        7 days ago

    """
    return repoze.timeago.get_elapsed(timestamp)
elapsed.is_safe = True
16

不确定这是否完全符合你的需求,但在django.contrib.humanize模板标签中,有一个叫naturaltime的标签,可以实现这个功能:

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

settings.py

INSTALLED_APPS = {
    ...
    'django.contrib.humanize',
}

template.html

{% load humanize %}
{{ model.timefield|naturaltime }}

撰写回答