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只指定默认表单值的外观,而不是输入数据的解析方式。这是否意味着如果不进行更改,此处的代码将无法工作?这是否意味着如果不进行更改,此处的代码将无法工作?