在 Django 中,我如何获得一个接受 ISO 8601 日期时间字符串并使用 DateTimeField 的小部件?

In Django how can I get a widget that accepts an ISO 8601 datetime string and works with a DateTimeField?

我想将带有 time zone designator 的 ISO 8601 日期时间字符串提交到我正在编写的 django 表单。我想为日期时间使用标准 DateTimeField,但有一个小部件可以接受这样的日期时间字符串。这可能吗,还是我对小部件和字段之间的关系感到困惑?我该怎么做?


解析字符串很容易,使用django.utils.datepase.parse_datetime

我试过像这样写一个小部件:

from django.forms import HiddenInput
from django.utils.dateparse import parse_datetime

class DateTimeInputForMachines(HiddenInput):
    def _format_value(self, value):
        out = super(DateTimeInputForMachines, self)._format_value(parse_datetime(value))
        return out

并像这样在 ModelForm 中使用它:

from mywidgets import DateTimeInputForMachines

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['start', 'thing']

        widgets = {
            'start': DateTimeInputForMachines()
        }

但是 'start' 字段验证失败 "Enter a valid date/time."

Widgets是用来展示数据的,与校验无关

如果您只需要输入自定义日期格式,则不需要任何子类化;您可以直接在字段上提供 input_formats(参见 the documentation)。

class MyForm(forms.ModelForm):
    start = forms.DateTimeField(input_formats=["%Y-%m-%dT%H:%M:%S.%z"])

    class Meta:
        model = MyModel
        fields = ['start', 'thing']