Django日期时间验证不正确

5
我将使用HTML5 datetime-local 输入类型来尝试将一些日期时间数据存入数据库。 ModelFormclass 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,其为输入有效的日期/时间
3个回答

11

误解:

引用文档的话:

不要将控件与表单字段混淆。表单字段处理输入验证逻辑,并直接在模板中使用,而控件处理在网页上呈现HTML表单输入元素和提取原始提交数据。

控件对验证没有影响。您为控件设置了格式参数,但这并不意味着表单字段验证将使用它-它只设置了呈现控件内容的初始格式:

format: 显示此字段的初始值的格式。


解决方案

两个选项:

  • 通过传递参数,为表单字段(forms.DateTimeField)提供要使用的日期时间格式。

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

    需要对每个表单字段执行此操作(可能甚至包括它们的小部件)。您在这里所做的实际上是覆盖设置(请参阅下一点)。

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


非常感谢您的澄清。在我接受这个答案之前,我是否正确地认为上述解决方案意味着我将不得不在我的视图代码中处理日期保存,以便 form.save() 不能完全处理它(这是使用 ModelForm 的最大优势)? - robotHamster
1
不,如果您以任何一种正确的格式提供,该字段的“clean”方法将会输出表单需要正确保存的“datetime.datetime”实例。我对答案进行了一些编辑,包括一些非常重要的细节:1)它是“input_formats”,而不是“input_format”2)“input_formats”需要是可迭代的(否则,它将令人困惑地引发“ValidationError”)。我强烈建议使用设置方法。 - CoffeeBasedLifeform

0

你只是打错了字。在class的值中把'fom'改成'form'。

'calendar': forms.Select(attrs={ 'class': 'form-control chosen-select' }),


谢谢指出笔误,但那不是导致错误的原因(样式只是有点不同)。错误来自于“start”和“end”字段。 - robotHamster
在表单类、模型类或者小部件本身上? - robotHamster
我在字段的初始化中添加了 localize=True...基本上是一样的。 - robotHamster
本地化应该紧跟在格式化后面,用逗号分隔。您能否跟踪前端和后端的数据以进行比较? - dp2050
localize=True right after format='%Y-%m-%dT%H:%M' errors as unexpected keyword argument - robotHamster

0
也许你需要import datetime来确保它是Python的有效日期/时间格式,在这里你可以看到一个方法。

我在 views.py 中导入了 datetime,但验证仍然返回相同的结果。 - robotHamster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接