Как я могу получить Django SplitDateTimeWidget для распознавания входов AM / PM? - PullRequest
0 голосов
/ 13 января 2011

Не могу понять, как заставить 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 - это DateTimeField в моей модели:

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

Ничто из того, что я делаю, кажется, не проходит проверку - я продолжаю получать ошибки в этом поле. Какие-либо предложения? Я искал 2 часа безрезультатно. Я могу получить его для проверки, если я придерживаюсь 24-часового времени или если я пропускаю часть AM / PM, но я бы скорее смог правильно интерпретировать AM / PM.

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 марта 2016

Вы можете просто переопределить 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'
]
0 голосов
/ 16 января 2011

В конечном итоге, после того, как я много покопался в источнике для SplitDateTimeWidget, я не увидел способа передать input_time_formats в виджет. Возможно, есть способ (я не достаточно хорошо понимаю общую родословную между полями и виджетами, чтобы точно сказать, так или иначе), но я не смог его найти.

Однако я смог заставить его работать, переопределив поля и используя SplitDateTimeField в ModelForm (исходные поля в модели имеют тип 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')
...