diff --git a/AUTHORS b/AUTHORS index 5f032cf31b..6e6e84cacf 100644 --- a/AUTHORS +++ b/AUTHORS @@ -746,6 +746,7 @@ answer newbie questions, and generally made Django that much better: Wilson Miner wojtek Xia Kai + Yann Fouillat Yann Malet Yasushi Masuda ye7cakf02@sneakemail.com diff --git a/django/utils/formats.py b/django/utils/formats.py index 0ae8989409..d09003c72b 100644 --- a/django/utils/formats.py +++ b/django/utils/formats.py @@ -110,8 +110,6 @@ def get_format(format_type, lang=None, use_l10n=None): be localized (or not), overriding the value of settings.USE_L10N. """ format_type = force_str(format_type) - if format_type not in FORMAT_SETTINGS: - return format_type if use_l10n or (use_l10n is None and settings.USE_L10N): if lang is None: lang = get_language() @@ -120,9 +118,6 @@ def get_format(format_type, lang=None, use_l10n=None): cached = _format_cache[cache_key] if cached is not None: return cached - else: - # Return the general setting by default - return getattr(settings, format_type) except KeyError: for module in get_format_modules(lang): try: @@ -137,6 +132,9 @@ def get_format(format_type, lang=None, use_l10n=None): except AttributeError: pass _format_cache[cache_key] = None + if format_type not in FORMAT_SETTINGS: + return format_type + # Return the general setting by default return getattr(settings, format_type) get_format_lazy = lazy(get_format, six.text_type, list, tuple) diff --git a/docs/releases/1.8.8.txt b/docs/releases/1.8.8.txt index 1a28efe167..94cda25ba2 100644 --- a/docs/releases/1.8.8.txt +++ b/docs/releases/1.8.8.txt @@ -14,3 +14,7 @@ Bugfixes * Corrected ``__len`` query lookup on ``ArrayField`` for empty arrays (:ticket:`25772`). + +* Restored the ability to use custom formats from ``formats.py`` with + ``django.utils.formats.get_format()`` and the ``date`` template filter + (:ticket:`25812`). diff --git a/docs/topics/i18n/formatting.txt b/docs/topics/i18n/formatting.txt index 62e4cc9ede..8a96bd74a9 100644 --- a/docs/topics/i18n/formatting.txt +++ b/docs/topics/i18n/formatting.txt @@ -170,7 +170,10 @@ the package where format files will exist, for instance:: ] Files are not placed directly in this directory, but in a directory named as -the locale, and must be named ``formats.py``. +the locale, and must be named ``formats.py``. Be careful not to put sensitive +information in these files as values inside can be exposed if you pass the +string to ``django.utils.formats.get_format()`` (used by the :tfilter:`date` +template filter). To customize the English formats, a structure like this would be needed:: diff --git a/tests/i18n/other/locale/fr/__init__.py b/tests/i18n/other/locale/fr/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/i18n/other/locale/fr/formats.py b/tests/i18n/other/locale/fr/formats.py new file mode 100644 index 0000000000..d13e245c30 --- /dev/null +++ b/tests/i18n/other/locale/fr/formats.py @@ -0,0 +1,2 @@ +# A user-defined format +CUSTOM_DAY_FORMAT = 'd/m/Y CUSTOM' diff --git a/tests/i18n/tests.py b/tests/i18n/tests.py index db16eaf5e2..573a722f56 100644 --- a/tests/i18n/tests.py +++ b/tests/i18n/tests.py @@ -1248,6 +1248,11 @@ class FormattingTests(SimpleTestCase): def test_format_arbitrary_settings(self): self.assertEqual(get_format('DEBUG'), 'DEBUG') + def test_get_custom_format(self): + with self.settings(FORMAT_MODULE_PATH='i18n.other.locale'): + with translation.override('fr', deactivate=True): + self.assertEqual('d/m/Y CUSTOM', get_format('CUSTOM_DAY_FORMAT')) + class MiscTests(SimpleTestCase):