Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

Use of TIME_INPUT_FORMATS in TimeField

184 views
Skip to first unread message

Arthur Pemberton

unread,
Mar 5, 2024, 2:43:22 AM3/5/24
to django-d...@googlegroups.com
The documentation (https://docs.djangoproject.com/en/5.0/ref/forms/fields/#timefield) says that " the default input formats are taken from the active locale format TIME_INPUT_FORMATS key, or from TIME_INPUT_FORMATS if localization is disabled". However, neither my reading of the code, or my actual experience shows settings.TIME_INPUT_FORMATS ever being used, even with "USE_I18N = False"

TimeField gets the formats from `input_formats = formats.get_format_lazy("TIME_INPUT_FORMATS")` which is a lazy version of `formats.get_format` -- the documentation of which says "If use_l10n is provided and is not None, it forces the value to be localized (or not), otherwise it's always localized."

so even with "USE_I18N = False" settings.TIME_INPUT_FORMATS seems to be ignored.

How does one use settings.TIME_INPUT_FORMATS ?

Arthur Pemberton

David Sanders

unread,
Mar 5, 2024, 3:00:43 AM3/5/24
to django-d...@googlegroups.com
Define TIME_INPUT_FORMATS in your local formats.py setup as per: https://docs.djangoproject.com/en/5.0/topics/i18n/formatting/#creating-custom-format-files

--
You received this message because you are subscribed to the Google Groups "Django developers (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CA%2BX4dQRAjfSJnAK9iZ%3DhJMkN%2BTfoShX6%2BNRsjM0oMF6jGDSuZg%40mail.gmail.com.

Arthur Pemberton

unread,
Mar 5, 2024, 3:48:58 AM3/5/24
to django-d...@googlegroups.com
Thanks, I'll look into that. But does that mean that settings.TIME_INPUT_FORMATS no longer has any use? I don't see any logic flows that lead to it being used.

Adam Johnson

unread,
Mar 5, 2024, 3:41:10 PM3/5/24
to Arthur Pemberton, django-d...@googlegroups.com
USE_I18N does not disable localization, but internationalization. USE_L10N was the setting to enable/disable localization, but it was deprecated in Django 4.0: https://docs.djangoproject.com/en/4.0/releases/4.0/#localization . It was removed completely in Django 5.0, in this commit: https://github.com/django/django/commit/8d98f99a4ab5de6f2c730399f53eba8bf6bea470 .

So I think the phrase “if localization is disabled” is at least a little bit wrong. But I don’t think the setting is ignored, as there are tests confirming that it works: https://github.com/django/django/blob/8d98f99a4ab5de6f2c730399f53eba8bf6bea470/tests/forms_tests/tests/test_input_formats.py#L123-L125 . The line that reads the setting should be this one: https://github.com/django/django/blob/8d98f99a4ab5de6f2c730399f53eba8bf6bea470/django/utils/formats.py#L132 .

If you can provide a failing minimal project, that would be useful to keep debugging. I have some minimal django project templates at https://github.com/adamchainz/django-startproject-templates .

Arthur Pemberton

unread,
May 18, 2024, 4:14:37 PM5/18/24
to Adam Johnson, django-d...@googlegroups.com
I haven't yet checked the tests thoroughly enough to determine why things didn't work for me in practice. I do know they didn't work. And I do see that the tests pass. But I suspect that the tests may not be fully mimicking the read-world use case in this scenario.

I'll return here once I have some evidence either way,

Arthur Pemberton

Natraj Kavander

unread,
May 18, 2024, 9:06:33 PM5/18/24
to django-d...@googlegroups.com, Adam Johnson

Arthur Pemberton

unread,
Dec 8, 2024, 9:56:25 AM12/8/24
to Adam Johnson, django-d...@googlegroups.com
I finally got back to this. 

I have a failing minimal project (not test) that demonstrates TIME_INPUT_FORMATS not being respected:

In the example, the form should be valid, if TIME_INPUT_FORMATS worked as documented.

I _think_ there's something about how the unittest is written that allows it to pass, and not expose this.

Regards,
Arthur

On Tue, Mar 5, 2024 at 3:40 PM Adam Johnson <m...@adamj.eu> wrote:

Arthur Pemberton

unread,
Dec 8, 2024, 8:03:22 PM12/8/24
to Adam Johnson, django-d...@googlegroups.com
To simplify things further, within a view:

TIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M', '%I:%M %p']

and

forms.TimeField.input_formats = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']

Arthur Pemberton

unread,
Dec 9, 2024, 4:58:48 AM12/9/24
to Django developers (Contributions to Django itself)
As further follow up on this, as far as I can tell, the relevant unit test does not run, seemingly due to the use of `translation.override(None)`

Removing, that, and running the test `./runtests.py forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_timeField` results in the test failing.

Arthur Pemberton

Arthur Pemberton

unread,
Dec 9, 2024, 5:03:01 AM12/9/24
to Django developers (Contributions to Django itself)
Adam,

Up until now, I've only been reading the test. Now that I actually tried running the test, it does not get discovered by the testing system (without modifications to test_input_formats.py) and when I do get the test to run, it fails.

I used tag "5.1.4" to get the unit tests.

Arthur

zaw naing

unread,
Dec 9, 2024, 10:42:19 AM12/9/24
to django-d...@googlegroups.com
hello I'm new to Django Developer anyone can share learning document?

Reply all
Reply to author
Forward
0 new messages