14

Greetings, I am trying to implement a TimeField model which only consists of HH:MM (ie 16:46) format, I know it is possible to format a regular Python time object but I am lost about how to manage this with Django.

Cheers

Hellnar
  • 62,315
  • 79
  • 204
  • 279

7 Answers7

11

Django widget can be used to achieve this easily.

from django import forms

class timeSlotForm(forms.Form):
    from_time = forms.TimeField(widget=forms.TimeInput(format='%H:%M'))
IJR
  • 1,288
  • 13
  • 14
8

DateTime fields will always store also seconds; however, you can easily tell the template to just show the hours and minute, with the time filter:

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

where "value" is the variable containing the datetime field.

Of course, you can also resort to other tricks, like cutting out the seconds from the field while saving; it would require just a small change to the code in the view handling the form, to do something like this:

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

(note: this is an ugly and untested code, just to give the idea!)

Finally, you should note that the admin will still display the seconds in the field.
It should not be a big concern, though, because admin should be only used by a kind of users that can be instructed not to use that part of the field.
In case you want to patch also the admin, you can still assign your own widget to the form, and thus having the admin using it. Of course, this would mean a significant additional effort.

rob
  • 36,896
  • 2
  • 55
  • 65
  • 1
    In Django class-based views' forms setting TIME_INPUT_FORMATS in settings worked for me. https://docs.djangoproject.com/en/dev/ref/settings/#time-input-formats – maciek Jan 08 '15 at 20:18
  • @maciek: that did not work for me. Setting `TIME_INPUT_FORMATS = [ '%H:%M', ]` in `settings.py` was not enough. I had to specify the widget. – SaeX Oct 20 '15 at 12:29
5

So I think the proposed and accepted solution is not optimal because with:

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

For a SplitDateTimeField in my case but for you only change it to TimeWidget.

Hope it helps other people too.

user698296
  • 59
  • 1
  • 1
2

TimeField model

in Template

Is displayed

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


Is not displayed

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

Django 1.4.1

2

For a ModelForm, you can easily add a widget like this, to avoid the seconds being shown (just show hh:mm):

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'),
        }
SaeX
  • 17,240
  • 16
  • 77
  • 97
  • 1
    Finally found the correct reply, thank you! Anyone wanting to see the documentation for this: https://docs.djangoproject.com/en/3.2/ref/forms/widgets/#django.forms.TimeInput.format – kunambi Oct 25 '21 at 23:02
2

You can at least modify the output in the __str__ method on the model by using datetime.time.isoformat(timespec='minutes'), like this:

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

Now the value is showing as HH:MM in admin pages.

j0n4t
  • 21
  • 2
0

On Django 1.9 the following format should work:

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

Django has a whole set of template tags and filters.

Django 1.9 documentation on this is:

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

mrmango
  • 1
  • 1