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

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

ура

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()

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

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

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

from django import forms

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

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

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

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

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

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

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

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

Для 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'),
        }

Модель TimeField

в шаблоне

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

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


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

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

Джанго 1.4.1

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

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

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

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

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

Другие вопросы по тегам