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
相关产品推荐
相关产品推荐

