Django 日期时间不验证正确

Django datetime not validating right

我正在使用 HTML5 datetime-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',
        })

    }

我的表单验证一直失败,这让我焦头烂额。This is 显示它的文档页面应该可以工作,但我好像遗漏了什么?

编辑澄清:

startend 的错误消息都是 Enter a valid date/time

你只是打错了字。在 class 值中将其设为 'form' 而不是 'fom'。

'calendar': forms.Select(属性={ 'class': 'fom-control chosen-select' }),

也许您需要 import datetime 以确保它是 python 的有效 date/time 格式,here 您可以看到一个方法。

误解:

引用docs

Widgets should not be confused with the form fields. Form fields deal with the logic of input validation and are used directly in templates. Widgets deal with rendering of HTML form input elements on the web page and extraction of raw submitted data.

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

format: The format in which this field’s initial value will be displayed.


解决方案

两个选项:

  • 通过传递 input_formats 参数

    ,为表单字段 (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')
        )
    

    这需要为每个表单域完成(并且可能通过扩展甚至他们的小部件)。你在这里所做的是有效地覆盖设置(见下一点)。

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