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

Django自定义日期时间格式在表单字段中不生效问题求助

问题

在Django项目中为适配本地化需求,已按照官方文档在settings.py中配置了自定义的日期时间输入格式DATE_INPUT_FORMATS和DATETIME_INPUT_FORMATS,但表单字段仍使用默认格式。输入19-03-2024 17:25:17时触发“Enter a valid date/time”验证错误。调试发现DateTimeField的input_formats仅包含默认格式,虽DateTimeInput组件默认关联format_key为DATETIME_INPUT_FORMATS,但自定义配置未被读取。

配置代码(settings.py)

DATE_INPUT_FORMATS = [
    "%Y-%m-%d",
    "%m/%d/%Y",
    "%m/%d/%y",
    "%b %d %Y",
    "%b %d, %Y",
    "%d %b %Y",
    "%d %b, %Y",
    "%B %d %Y",
    "%B %d, %Y",
    "%d %B %Y",
    "%d %B, %Y",
    '%d-%m-%Y',
    '%d/%m/%Y'
]
DATETIME_INPUT_FORMATS = [
    "%Y-%m-%d %H:%M:%S",
    "%Y-%m-%d %H:%M:%S.%f",
    "%Y-%m-%d %H:%M",
    "%m/%d/%Y %H:%M:%S",
    "%m/%d/%Y %H:%M:%S.%f",
    "%m/%d/%Y %H:%M",
    "%m/%d/%y %H:%M:%S",
    "%m/%d/%y %H:%M:%S.%f",
    "%m/%d/%y %H:%M",
    '%d-%m-%Y %H:%M:%S',
    '%d/%m/%Y %H:%M:%S'
]

表单代码

class CDetailsForm(forms.ModelForm):
    class Meta:
        model = CDetails
        fields = ('c_date',)
        widgets = {
            'c_date': forms.DateTimeInput(
                attrs={'class': 'datetimepicker-input datetime_stamp form-control', 'readonly': 'readonly'}),
        }

    def is_valid(self):
        import pdb
        pdb.set_trace()
        result = super(CDetailsForm, self).is_valid()
        return result

调试信息显示:DateTimeField的input_formats未包含自定义格式,传入值为'19-03-2024 17:25:17'。

解决建议
  • 显式为表单字段指定input_formats:直接在表单类中为c_date字段绑定配置好的格式,绕过默认字段的格式加载逻辑:
    from django.conf import settings
    
    class CDetailsForm(forms.ModelForm):
        c_date = forms.DateTimeField(input_formats=settings.DATETIME_INPUT_FORMATS)
        
        class Meta:
            model = CDetails
            fields = ('c_date',)
            widgets = {
                'c_date': forms.DateTimeInput(
                    attrs={'class': 'datetimepicker-input datetime_stamp form-control', 'readonly': 'readonly'}),
            }
    
  • 检查本地化配置冲突:若项目设置USE_L10N = True,Django会优先使用本地化日期格式,覆盖自定义配置。可将USE_L10N设为False,或在字段中添加localize=False禁用本地化:
    c_date = forms.DateTimeField(input_formats=settings.DATETIME_INPUT_FORMATS, localize=False)
    
  • 确认Widget的format_key关联:显式在DateTimeInput中指定format_key,确保与settings中的配置项绑定:
    widgets = {
        'c_date': forms.DateTimeInput(
            attrs={'class': 'datetimepicker-input datetime_stamp form-control', 'readonly': 'readonly'},
            format_key='DATETIME_INPUT_FORMATS'
        ),
    }
    
  • 验证配置是否加载成功:在is_valid方法中打印settings的配置值,排除配置文件未被正确读取的问题:
    def is_valid(self):
        import pdb
        from django.conf import settings
        print(settings.DATETIME_INPUT_FORMATS) # 检查输出是否包含自定义格式
        pdb.set_trace()
        result = super(CDetailsForm, self).is_valid()
        return result
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:47:14