Модель Django TimeField без секунд

Приветствую, я пытаюсь реализовать модель TimeField, которая состоит только из формата ЧЧ:ММ (т.е. 16:46). Я знаю, что можно отформатировать обычный объект времени Python, но я не понимаю, как управлять этим с помощью Django.

Ваше здоровье


person Hellnar    schedule 06.08.2009    source источник


Ответы (7)


Поля DateTime всегда будут храниться также секунды; однако вы можете легко настроить шаблон так, чтобы он просто отображал часы и минуты с помощью фильтра time:

{{ value|time:"H:M" }}

где «значение» — это переменная, содержащая поле даты и времени.

Конечно, можно прибегнуть и к другим хитростям, вроде вырезания секунд из поля при сохранении; потребуется лишь небольшое изменение кода в представлении, обрабатывающем форму, чтобы сделать что-то вроде этого:

if form.is_valid():
  instance = form.save(commit=False)
  instance.nosecs = instance.nosecs.strptime(instance.nosecs.strftime("%H:%M"), "%H:%M")
  instance.save()

(примечание: это уродливый и непроверенный код, просто чтобы дать представление!)

Наконец, вы должны отметить, что администратор по-прежнему будет отображать секунды в поле.
Это не должно быть большой проблемой, потому что администратор должен использоваться только тем типом пользователей, которым можно дать указание не использовать эту часть. поля.
Если вы хотите исправить также администратора, вы все равно можете назначить свой собственный виджет для формы и, таким образом, позволить администратору использовать его. Конечно, это означало бы значительные дополнительные усилия.

person rob    schedule 06.08.2009
comment
В формах представлений на основе классов Django у меня сработала настройка TIME_INPUT_FORMATS в настройках. docs.djangoproject.com/en/dev/ref/settings /#форматы ввода-времени - person maciek; 08.01.2015
comment
@maciek: у меня это не сработало. Установки TIME_INPUT_FORMATS = [ '%H:%M', ] в settings.py было недостаточно. Пришлось указать виджет. - person SaeX; 20.10.2015

Для этого можно легко использовать виджет Django.

from django import forms

class timeSlotForm(forms.Form):
    from_time = forms.TimeField(widget=forms.TimeInput(format='%H:%M'))
person IJR    schedule 18.04.2012

Поэтому я думаю, что предложенное и принятое решение не является оптимальным, потому что с:

    datetime.widget = forms.SplitDateTimeWidget(time_format=('%H:%M'))

Для SplitDateTimeField в моем случае, но для вас измените его только на TimeWidget.

Надеюсь, это поможет и другим людям.

person user698296    schedule 17.06.2011

Модель TimeField

в шаблоне

Отображается

{{ value|time:"H:i" }}


Не отображается

{{ value|time:"H:M" }}

Джанго 1.4.1

person Kohei Hosoe    schedule 28.05.2013

Для ModelForm вы можете легко добавить такой виджет, чтобы секунды не отображались (просто покажите чч:мм):

class MyCreateForm(forms.ModelForm):

    class Meta:
        model = MyModel
        fields = ('time_in', 'time_out', )
        widgets = {
            'time_in': forms.TimeInput(format='%H:%M'),
            'time_out': forms.TimeInput(format='%H:%M'),
        }
person SaeX    schedule 20.10.2015

По крайней мере, вы можете изменить вывод метода __str__ в модели, используя datetime.time.isoformat(timespec='minutes'), например так:

def __str__(self):
    return self.value.isoformat(timespec='minutes')

Теперь значение отображается как ЧЧ:ММ на страницах администратора.

person j0n4t    schedule 14.11.2018

В Django 1.9 должен работать следующий формат:

{{ yourData.value|time:"H:i" }}

В Django есть целый набор шаблонных тегов и фильтров.

Документация Django 1.9 по этому поводу:

https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#time

person mrmango    schedule 19.10.2016