Django如何实现帖子发布时间显示为相对时长而非完整日期
Django 实现显示相对发布时间的解决方案
Django 内置了成熟的相对时间处理能力,不需要手动实现时间差计算逻辑,按以下步骤操作即可实现「X小时前」这类时间展示效果:
方案一:使用官方自带 humanize 组件(推荐)
步骤1:激活组件
打开项目 settings.py 文件,在 INSTALLED_APPS 配置列表中添加 django.contrib.humanize:
INSTALLED_APPS = [ # 原有其他配置保持不变 'django.contrib.humanize', ]
步骤2:模板加载标签
在你渲染帖子的模板文件顶部添加标签加载声明:
{% load humanize %}
步骤3:修改时间渲染代码
将原模板中渲染 created 字段的代码替换为带过滤器的写法:
@{{post.author}} - <small><i>{{ post.created|naturaltime }} </i></small> <br>
如果最终显示为英文相对时间,检查 settings.py 中的 LANGUAGE_CODE 配置是否为 zh-hans 即可切换为中文展示。
方案二:自定义模型属性(适合需要高度自定义展示逻辑的场景)
在你的 post 模型中新增一个计算相对时间的属性:
from django.utils import timezone import math class post(models.Model): # 原有字段保持不变 author = models.ForeignKey(User, on_delete=models.CASCADE) Topic = models.ForeignKey(topic, on_delete=models.CASCADE) post = models.TextField(max_length=500) created = models.DateTimeField(auto_now_add=True) update = models.DateTimeField(auto_now=True) liked = models.ManyToManyField(User, related_name='likes', default=None, blank=True) # 新增相对时间计算属性 @property def time_since_created(self): now = timezone.now() diff = now - self.created if diff.days >= 365: return f"{diff.days//365}年前" elif diff.days >= 30: return f"{diff.days//30}个月前" elif diff.days > 0: return f"{diff.days}天前" elif diff.seconds >= 3600: return f"{diff.seconds//3600}小时前" elif diff.seconds >= 60: return f"{diff.seconds//60}分钟前" else: return "刚刚" # 原有其他方法保持不变 def __str__(self): return f'{self.post}' @property def num_likes(self): return self.liked.all().count()
修改模板中时间渲染代码即可:
@{{post.author}} - <small><i>{{ post.time_since_created }} </i></small> <br>
内容的提问来源于stack exchange,提问作者Okafor Onyekachukwu
相关产品推荐
相关产品推荐

