在 django 中从数据库读取 datefield 值后若以字符串形式(如存入 session)暂存,再次转换为 `date` 或 `datetime` 对象时,需使用 python 标准库的 `strptime`,其格式符为 `%y-%m-%d`,而非 django 模板语法或错误拼写的 `%yyyy-%mm-%d`。
Django 的 DateField 在数据库中存储为标准日期类型(如 DATE),但当它被序列化为字符串(例如通过 str()、JSON 序列化、或存入 session)时,会默认转为 ISO 格式字符串,形如 ‘2024-02-14’。此时若需还原为 Python 的 date 对象(注意:不是 datetime),应优先使用 date.fromisoformat() —— 这是更简洁、安全且专为此设计的方法:
from datetime import date got_date = myModel.objects.get(id=1).date # 直接是 date 对象(无需转换!) # 若已变成字符串(如从 session 取出): got_date_str = "2024-02-14" got_date_obj = date.fromisoformat(got_date_str) # ✅ 推荐:简洁、高效、无需格式字符串
如果确实需要使用 strptime(例如处理非 ISO 格式),则必须遵循 Python 的 strftime/strptime 格式码:
- %Y 表示 4 位数字年份(✅ 正确);%YYYY 是无效格式,会直接报错;
- %m 表示零填充月份数(01–12);%MM 无效;
- %d 表示零填充日期(01–31);%d 正确,%DD 无效。
因此,修正后的代码应为: