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

升级至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:40:05