1

我一辈子都想不出如何让SplitDateTimeWidget链接到 ref doc)识别 AM/PM 输入。

我已经尝试过模板样式的输入:

widgets={'start_datetime':forms.SplitDateTimeWidget(time_format='h:i A')}

和标准的 Python 时间输入(这里建议):

widgets={'start_datetime':forms.SplitDateTimeWidget(time_format='%I:%M %p')}

正如你可能猜到的,在我的模型中start_datetime是 a :DateTimeField

start_datetime=models.DateTimeField('Start', default=datetime.now())

我所做的一切似乎都无法通过验证——我一直在该领域遇到错误。有什么建议么?我现在已经搜索了2个小时无济于事。我可以通过它来验证我是坚持 24 小时制还是省略了 AM/PM 部分,但我宁愿能够正确解释 AM/PM。

谢谢

4

2 回答 2

1

你可以覆盖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'
]
于 2016-03-26T15:59:45.493 回答
0

最终,在对源代码进行了大量研究之后SplitDateTimeWidget,我没有看到传递input_time_formats到小部件的方法。也许有一种方法(我不太了解字段和小部件之间的共同血统,无法确定一种或另一种方式),但我找不到它。

但是,我能够通过覆盖字段并SplitDateTimeField在 ModelForm 中使用来使其工作(模型中的原始字段是DateTime类型)。然后我需要DateTimeSplitDateTimeField后面传递到原始模型,因为表单字段和模型字段在我覆盖它之后没有链接。

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')
于 2011-01-16T01:23:37.283 回答