在 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']
我想将带有 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']