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',
        })

    }

我一直无法通过表单验证,这导致我拔头发。这是文档页面,显示它应该可以工作,但是好像我缺少什么?

编辑说明:

该错误消息是两个startend与它的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')
    )
    

这需要针对每个表单字段(可能甚至扩展其小部件)进行。您在这里所做的实际上是覆盖设置(请参阅下一点)。

  • 将日期时间格式添加到设置中作为第一项。这将全局应用于所有使用该设置的表单域和窗口小部件。