升级至Django 5.0后DATETIME_INPUT_FORMATS失效,无法识别DOY格式
Django 5.0 中 DATETIME_INPUT_FORMATS 不识别 %j 格式的解决方案
核心修复步骤
1. 字段级显式指定输入格式
Django 5.0 中,全局 DATETIME_INPUT_FORMATS 可能被模型/表单字段的局部配置覆盖,需在对应字段上直接声明格式列表:
模型字段示例
from django.db import models class TargetModel(models.Model): custom_datetime = models.DateTimeField( input_formats=[ '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%dT%H:%M:%S', '%Y-%m-%dT%H:%M', '%Y-%m-%d', '%Y-%j %H:%M:%S.%f', '%Y-%j %H:%M:%S', '%Y-%j %H:%M', '%Y-%jT%H:%M:%S.%f', '%Y-%jT%H:%M:%S', '%Y-%jT%H:%M', ] )
表单字段示例
from django import forms class TargetForm(forms.Form): custom_datetime = forms.DateTimeField( input_formats=[ '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%dT%H:%M:%S', '%Y-%m-%dT%H:%M', '%Y-%m-%d', '%Y-%j %H:%M:%S.%f', '%Y-%j %H:%M:%S', '%Y-%j %H:%M', '%Y-%jT%H:%M:%S.%f', '%Y-%jT%H:%M:%S', '%Y-%jT%H:%M', ] )
2. 验证输入格式匹配度
%j 对应一年中的第几天(格式为001-366),输入字符串必须严格符合 YYYY-DDD 格式(如2024-123),若输入天数不足三位(如2024-12),需补前导零或调整格式字符串。
3. 自定义解析器兜底
若上述方法无效,可自定义解析函数强制支持目标格式:
from django.core.exceptions import ValidationError from datetime import datetime def parse_doy_datetime(value): formats = [ '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M', '%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%dT%H:%M:%S', '%Y-%m-%dT%H:%M', '%Y-%m-%d', '%Y-%j %H:%M:%S.%f', '%Y-%j %H:%M:%S', '%Y-%j %H:%M', '%Y-%jT%H:%M:%S.%f', '%Y-%jT%H:%M:%S', '%Y-%jT%H:%M', ] for fmt in formats: try: return datetime.strptime(value, fmt) except ValueError: continue raise ValidationError(f"无效的日期时间格式: {value}") # 在表单中使用 class TargetForm(forms.Form): custom_datetime = forms.DateTimeField( input_formats=[], validators=[parse_doy_datetime] )
内容的提问来源于stack exchange,提问作者Emma Birath
相关产品推荐
相关产品推荐

