You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django博客项目用strftime格式化日期触发ValueError报错求助

解决Django中DateTimeField使用strftime出现ValueError的问题

嘿,我来帮你搞定这个strftime的报错问题~ 你遇到的ValueError大概率是两个核心原因导致的,我给你一步步分析和解决:

最常见的诱因:pub_date字段为None

如果你的Blog实例没有给pub_date赋值,数据库里这个字段是空值,调用strftime时就会因为对象是None而抛出错误。解决方法有两种:

方法1:让字段自动赋值

在模型里给pub_date加上auto_now_add=True,这样创建博客对象时会自动把当前时间赋值给这个字段,永远不会为空:

pub_date = models.DateTimeField(auto_now_add=True)

方法2:在方法中先判断字段是否有值

如果需要手动设置发布时间,就在pub_date_pretty方法里先检查pub_date是否存在,再执行格式化:

def pub_date_pretty(self):
    if self.pub_date:
        # 这里替换成你需要的时间格式,比如"%b %d %Y"会显示"Oct 05 2024"
        return self.pub_date.strftime("%Y-%m-%d %H:%M")
    return "未发布"  # 为空时显示的提示文本

另一种可能:strftime格式字符串错误

Python的strftime有固定的格式符,如果你用了不合法的格式符也会报错。给你列几个常用的正确格式符:

  • %Y:4位年份(如2024)
  • %m:两位月份(如10)
  • %d:两位日期(如05)
  • %H:24小时制小时(如14)
  • %M:分钟(如30)

确保你的格式字符串里都是这些合法字符,别用拼写错误或者系统不支持的格式符。

额外推荐:用Django模板过滤器更省心

其实在Django里,更推荐直接在模板中使用date过滤器来格式化时间,不用在模型里写额外方法,还能自动处理空值:

<!-- 直接格式化显示 -->
{{ blog.pub_date|date:"Y-m-d H:i" }}

<!-- 为空时显示默认文本 -->
{{ blog.pub_date|date:"Y-m-d H:i"|default:"未发布" }}

修正后的完整models.py示例

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField(auto_now_add=True)
    body = models.TextField()
    image = models.ImageField(upload_to='images/')

    def summary(self):
        return self.body[:100]

    def pub_date_pretty(self):
        if self.pub_date:
            return self.pub_date.strftime("%Y-%m-%d %H:%M")
        return "未发布"

内容的提问来源于stack exchange,提问作者perpetualdarkness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:15