我不能为我的生活弄清楚如何让SplitDateTimeWidget
(link to ref doc)识别AM / PM输入。
我尝试了两种模板式输入:
widgets={'start_datetime':forms.SplitDateTimeWidget(time_format='h:i A')}
和标准Python时间输入(suggested here):
widgets={'start_datetime':forms.SplitDateTimeWidget(time_format='%I:%M %p')}
您可以猜到,start_datetime
在我的模型中是DateTimeField
:
start_datetime=models.DateTimeField('Start', default=datetime.now())
我所做的一切似乎都没有通过验证 - 我一直在那个领域遇到错误。有什么建议?我一直在寻找2小时无济于事。我可以通过它来验证我是否坚持使用24小时或者如果我遗漏了AM / PM部分,但我宁愿能够正确解释AM / PM。
由于
答案 0 :(得分:0)
最终,在SplitDateTimeWidget
的源代码中进行了大量搜索后,我没有看到将input_time_formats
传递到窗口小部件的方法。也许有一种方法(我不明白字段和小部件之间的共同谱系,以便肯定以某种方式说出来),但我找不到它。
但是,我能够通过覆盖字段并在ModelForm中使用SplitDateTimeField
来使其工作(模型中的原始字段为DateTime
类型)。然后,我需要将DateTime
从SplitDateTimeField
传递回原始模型,因为表单字段和模型字段已取消链接,因为我将其覆盖。
class MyForm(forms.ModelForm):
start_datetime=forms.SplitDateTimeField(input_time_formats=['%I:%M %p'])
end_datetime=forms.SplitDateTimeField(input_time_formats=['%I:%M %p'])
class Meta:
model=MyModel
exclude=('start_datetime','end_datetime')
def clean(self):
self.instance.start_datetime=self.cleaned_data.get('start_datetime')
self.instance.end_datetime=self.cleaned_data.get('end_datetime')
答案 1 :(得分:0)
您可以覆盖django.contrib.admin.widgets.AdminSplitDateTime
这是代码:
class CustomAdminSplitDateTime(AdminSplitDateTime):
def __init__(self, attrs=None):
widgets = [AdminDateWidget, AdminTimeWidget(attrs=None, format='%I:%M %p')]
forms.MultiWidget.__init__(self, widgets, attrs)
现在您可以按如下方式使用它:
class MyForm(forms.ModelForm):
class Meta:
model=MyModel
exclude=()
start_datetime= forms.DateField(
widget=CustomAdminSplitDateTime()
)
end_datetime= forms.DateField(
widget=CustomAdminSplitDateTime()
)
不要忘记将时间格式添加到设置文件中支持的格式,例如:
TIME_INPUT_FORMATS = [
'%I:%M %p',
'%H:%M:%S',
'%H:%M:%S.%f',
'%H:%M'
]