如何自定义Django humanize中naturaltime模板过滤器的文本?
自定义Django humanize的naturaltime过滤器输出格式
方法一:通过本地化翻译覆盖默认文本
这种方法利用Django的i18n机制修改默认文案,适合需要统一调整多语言输出的场景:
- 在项目根目录创建
locale文件夹,然后在settings.py中配置本地化路径:LOCALE_PATHS = [ BASE_DIR / 'locale', ] - 提取humanize应用的翻译字符串到项目locale目录(以中文为例,替换为你实际使用的语言代码):
django-admin makemessages -l zh-hans -d django - 打开生成的
locale/zh-hans/LC_MESSAGES/django.po文件,搜索未来日期对应的翻译条目:
找到类似如下的原条目:
修改为你需要的格式:msgid "%d days from now" msgstr "%d天后" msgid "%d day from now" msgstr "%d天后"
(如果需要调整小时、分钟等其他未来时间单位的输出,找到对应的条目修改即可)msgid "%d days from now" msgstr "in %d d" msgid "%d day from now" msgstr "in %d d" - 编译翻译文件使其生效:
django-admin compilemessages - 确保
settings.py中的LANGUAGE_CODE配置正确,之后模板里的naturaltime就会输出自定义格式。
方法二:自定义模板过滤器重写逻辑
如果不需要全局修改翻译,也可以直接写一个自定义过滤器,完全控制输出逻辑:
- 在你的应用目录下创建
templatetags文件夹(记得添加__init__.py文件),然后新建custom_humanize.py:from django import template from django.utils.timezone import now register = template.Library() @register.filter def custom_naturaltime(value): current_time = now() if value > current_time: delta = value - current_time # 按秒、分钟、小时、天分级处理 if delta.days == 0: if delta.seconds < 60: return f"in {delta.seconds} s" elif delta.seconds < 3600: minutes = delta.seconds // 60 return f"in {minutes} m" else: hours = delta.seconds // 3600 return f"in {hours} h" else: return f"in {delta.days} d" # 过去的时间保留原naturaltime的逻辑,也可以自行修改 else: from django.utils.timesince import timesince return f"{timesince(value, current_time).split(', ')[0]} ago" - 在模板中加载并使用这个自定义过滤器:
{% load custom_humanize %} {{ your_date_variable|custom_naturaltime }}
内容的提问来源于stack exchange,提问作者Dova Kin
相关产品推荐
相关产品推荐

