Django datetime未验证正确
问题内容:
我正在使用HTML5datetime-local
输入类型来尝试将一些日期时间数据输入数据库。
该ModelForm
class Meta:
如下所示:
class Meta:
model = ScheduleEntry
fields = ['calendar', 'title', 'start', 'end', 'assets', 'users']
widgets = {
'calendar': forms.Select(attrs={
'class': 'fom-control chosen-select'
}),
'title': forms.TextInput(attrs={
'class': 'form-control'
}),
'start': forms.DateTimeInput(attrs={
'type':'datetime-local',
'class':'form-control'
}, format='%Y-%m-%dT%H:%M'),
'end': forms.DateTimeInput(attrs={
'type': 'datetime-local',
'class': 'form-control'
}, format='%Y-%m-%dT%H:%M'),
'assets': forms.SelectMultiple(attrs={
'class': 'form-control chosen-select'
}),
'users': forms.SelectMultiple(attrs={
'class': 'form-control chosen-select',
})
}
我一直无法通过表单验证,这导致我拔头发。这是文档页面,显示它应该可以工作,但是好像我缺少什么?
编辑说明:
该错误消息是两个start
和end
与它的Enter a valid date/time
问题答案:
误解:
引用文档:
窗口小部件不应与表单字段混淆。表单字段处理输入验证的逻辑,并直接在模板中使用。窗口小部件处理HTML表单输入元素在网页上的呈现以及原始提交数据的提取。
小部件对验证没有影响。您为小部件提供了格式参数,但这并不意味着表单字段验证将使用它-它仅设置显示小部件内容的初始格式:
format :将显示该字段的初始值的格式。
解决方案
两种选择:
forms.DateTimeField
通过传递input_formats
参数,为表单字段()提供您要使用的日期时间格式class MyIdealDateForm(forms.ModelForm): start = forms.DateTimeField( input_formats = ['%Y-%m-%dT%H:%M'], widget = forms.DateTimeInput( attrs={ 'type': 'datetime-local', 'class': 'form-control'}, format='%Y-%m-%dT%H:%M') )
这需要针对每个表单字段(可能甚至扩展其小部件)进行。您在这里所做的实际上是覆盖设置(请参阅下一点)。
- 将日期时间格式添加到设置中作为第一项。这将全局应用于所有使用该设置的表单域和窗口小部件。