Python 如何让Django SplitDateTimeWidget识别AM/PM输入?
我一辈子都不知道如何让Python 如何让Django SplitDateTimeWidget识别AM/PM输入?,python,django,datetime,django-forms,django-widget,Python,Django,Datetime,Django Forms,Django Widget,我一辈子都不知道如何让SplitDateTimeWidget()识别AM/PM输入 我尝试了两种模板样式输入: widgets={'start_datetime':forms.SplitDateTimeWidget(time_format='h:i A')} 以及标准Python时间输入(): 您可以猜到,start\u datetime在我的模型中是一个datetime字段: start_datetime=models.DateTimeField('Start', default=datet
SplitDateTimeWidget
()识别AM/PM输入
我尝试了两种模板样式输入:
widgets={'start_datetime':forms.SplitDateTimeWidget(time_format='h:i A')}
以及标准Python时间输入():
您可以猜到,start\u datetime
在我的模型中是一个datetime字段
:
start_datetime=models.DateTimeField('Start', default=datetime.now())
我所做的一切似乎都无法使其通过验证——我在该领域不断出现错误。有什么建议吗?我已经搜索了两个小时,都没有结果。我可以让它验证我是否坚持24小时制,或者是否省略了AM/PM部分,但我更希望能够正确解释AM/PM
谢谢最后,在对
SplitDateTimeWidget
的源代码进行了大量搜索之后,我没有找到将input\u time\u格式
传递到widget中的方法。也许有一种方法(我不太了解字段和小部件之间的共同血统,因此不能肯定地说是这样或那样),但我找不到它
然而,我能够通过覆盖字段并在ModelForm中使用splitdatetime
使其工作(模型中的原始字段是DateTime
类型)。然后,我需要将DateTime
从splitdatetime字段
传递回原始模型,因为表单字段和模型字段在我重写它之后就没有链接了
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')
最后,在为
SplitDateTimeWidget
查找了很多源代码之后,我没有找到将input\u time\u格式
传递到widget中的方法。也许有一种方法(我不太了解字段和小部件之间的共同血统,因此不能肯定地说是这样或那样),但我找不到它
然而,我能够通过覆盖字段并在ModelForm中使用splitdatetime
使其工作(模型中的原始字段是DateTime
类型)。然后,我需要将DateTime
从splitdatetime字段
传递回原始模型,因为表单字段和模型字段在我重写它之后就没有链接了
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')
您可以只覆盖
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'
]
您可以只覆盖
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'
]
经过大量的研究,我意识到时间格式根本不是我想要的。time_格式只指定默认表单值的外观,而不是输入数据的解析方式。经过大量研究,我意识到time_格式根本不是我想要的。time_format只指定默认表单值的外观,而不是输入数据的解析方式。这是否意味着如果不进行更改,此处的代码将无法工作?这是否意味着如果不进行更改,此处的代码将无法工作?