Opened 11 months ago

Last modified 9 months ago

#35333 new Bug

Template tag `unlocalize` does not work with `date` and `time` filters.

Reported by: Natalia Bidart Owned by:
Component: Template system Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no
Pull Requests:18021 build:success

Description

Following #35306, it was noticed that using the date or time template filters would not honor the unlocalize template tag. See regression tests:

  • TabularUnified tests/i18n/tests.py

    diff --git a/tests/i18n/tests.py b/tests/i18n/tests.py
    index 355505a10d..90cf4630bf 100644
    a b class FormattingTests(SimpleTestCase):  
    13511351                self.assertEqual(template2.render(context), output2)
    13521352                self.assertEqual(template3.render(context), output3)
    13531353
     1354    def test_unlocalize_honor_date_settings(self):
     1355        filter_template = Template(
     1356            "{% load l10n %}Localized: {{ my_value }}. "
     1357            "Unlocalized: {{ my_value|unlocalize }}."
     1358        )
     1359        tag_template = Template(
     1360            "{% load l10n %}Localized: {{ my_value }}. {% localize off %}"
     1361            "Unlocalized: {{ my_value }}{% endlocalize %}."
     1362        )
     1363        filter_inside_unlocalize = Template(
     1364            "{% load l10n %}Localized: {{ my_value|date }}. {% localize off %}"
     1365            "Unlocalized: {{ my_value|date:'DATE_FORMAT' }}{% endlocalize %}."
     1366        )
     1367        context = Context({"my_value": datetime.date(2024, 12, 15)})
     1368        expected_result = "Localized: 15. Dezember 2024. Unlocalized: 15-12-2024."
     1369        for case in (filter_template, tag_template, filter_inside_unlocalize):
     1370            with (
     1371                self.subTest(case=str(case)),
     1372                translation.override("de", deactivate=True),
     1373                self.settings(DATE_FORMAT="j-m-Y"),
     1374            ):
     1375                self.assertEqual(case.render(context), expected_result)
     1376
     1377    def test_unlocalize_honor_time_settings(self):
     1378        filter_template = Template(
     1379            "{% load l10n %}Localized: {{ my_value }}. "
     1380            "Unlocalized: {{ my_value|unlocalize }}."
     1381        )
     1382        tag_template = Template(
     1383            "{% load l10n %}Localized: {{ my_value }}. {% localize off %}"
     1384            "Unlocalized: {{ my_value }}{% endlocalize %}."
     1385        )
     1386        filter_inside_unlocalize = Template(
     1387            "{% load l10n %}Localized: {{ my_value|time }}. {% localize off %}"
     1388            "Unlocalized: {{ my_value|time }}{% endlocalize %}."
     1389        )
     1390        context = Context({"my_value": datetime.time(1, 2, 3)})
     1391        expected_result = "Localized: 01:02. Unlocalized: 01h 02m."
     1392        for case in (filter_template, tag_template, filter_inside_unlocalize):
     1393            with (
     1394                self.subTest(case=str(case)),
     1395                translation.override("de", deactivate=True),
     1396                self.settings(TIME_FORMAT="H\\h i\\m"),
     1397            ):
     1398                self.assertEqual(case.render(context), expected_result)
     1399
    13541400    def test_localized_off_numbers(self):
    13551401        """A string representation is returned for unlocalized numbers."""
    13561402        template = Template(

According to the ticket's flags, the next step(s) to move this issue forward are:

  • To provide a patch by sending a pull request. Claim the ticket when you start working so that someone else doesn't duplicate effort. Before sending a pull request, review your work against the patch review checklist. Check the "Has patch" flag on the ticket after sending a pull request and include a link to the pull request in the ticket comment when making that update. The usual format is: [https://github.com/django/django/pull/#### PR].

Change History (2)

comment:1 by Claude Paroz, 10 months ago

I'm not yet sure if this can be resolved in the code, or if we should rather complement the template filter docs, telling that if you apply an l10n-sensible filter inside an unlocalized section, you should specify an explicit format argument. The problem being that the way filters are currently implemented, it's not possible to transmit any context. That explains for example that floatformat gained an u parameter to force unlocalization (see #30086).

So in your example in the tests above, you should use |date:settings.DATE_FORMAT and not just DATE_FORMAT. Thoughts?

comment:2 by Claude Paroz, 9 months ago

Owner: Claude Paroz removed
Status: assignednew
Note: See TracTickets for help on using tickets.
Back to Top