Opened 19 months ago

Last modified 9 months ago

#30086 new Cleanup/optimization

Document how floatformat template filter interacts with the localize template tag

Reported by: Meiyer Owned by: nobody
Component: Documentation Version: 1.11
Severity: Normal Keywords:
Cc: Florian Demmer Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Tim Graham)

Specifically, when the filter is used within the {% localize [on|off] %} block with the localization setting opposed to the value of USE_L10N ('on' when USE_L10N = False or 'off' when USE_L10N = True), the localization setting has not effect.

This is due to the use of formats.number_format() without its use_l10n parameter, by the numberformat template filter (e.g. https://github.com/django/django/blob/c2c85663e2dd06c9ed9c9ec2d02202d6d668d7f0/django/template/defaultfilters.py#L144, https://github.com/django/django/blob/c2c85663e2dd06c9ed9c9ec2d02202d6d668d7f0/django/template/defaultfilters.py#L163). The value of the use_l10n parameter shall be taken out of the template rendering context. But I do not see any easy solution to this, as filters do not take context...

Change History (7)

comment:1 Changed 19 months ago by Tim Graham

Component: Template systemDocumentation
Description: modified (diff)
Summary: The numberformat template filter does not respect local localization settingsDocument how floatformat template filter interacts with the localize template tag
Triage Stage: UnreviewedAccepted
Type: BugCleanup/optimization

As long as the behavior doesn't contract existing documentation, perhaps the solution is the document the current behavior.

comment:2 in reply to:  1 ; Changed 19 months ago by Marc Parizeau

Replying to Tim Graham:

As long as the behavior doesn't contract existing documentation, perhaps the solution is the document the current behavior.

Documenting would be better than nothing, but this behavior goes against the principle of least astonishment. Finding a way to honor the localize directive would be better. Any other filters that are affected by this limitation?

comment:3 Changed 19 months ago by Claude Paroz

All filters are affected. As the reporter noticed, the filters are currently not aware of the rendering context. That's no easy fix.

comment:4 in reply to:  2 Changed 19 months ago by Meiyer

Replying to Marc Parizeau:

this behavior goes against the principle of least astonishment

+1
I consider this as a bug in the implementation of the filter, even though the original title of the ticket was modified by Tim. Why would something inside a {% localize off %} block still keep being localised?.. I actually opened this ticket after having to dig through Django's code and adding debug statements to understand what was happening.

Going forward, I see only two possible solutions:

  • either introduce for filters a non-breaking support for context (meaning, filters will be able to take context without breaking existing code),
  • or, deprecate the floatformat filter (and possibly other), replacing it (them) with tags.

I personally favour the first option, but I realise it will require a lot of effort.

comment:5 Changed 19 months ago by Tim Graham

In my 10 years of work with Django, I don't recall another report of this issue, so I doubt that such disruptive changes would be acceptable for what I perceive as a relatively minor issue. You're welcome to make your proposal on the DevelopersMailingList to try to gather a consensus. A custom floatformat template tag may meet your needs, but deprecating the filter seems a bit drastic for the 99% of users who aren't affected by this issue.

comment:6 Changed 19 months ago by Claude Paroz

Did someone explore adding support for @register.filter(takes_context=True). If someone can produce some proof-of-concept code, it may have a chance to get accepted.

comment:7 Changed 9 months ago by Florian Demmer

Cc: Florian Demmer added
Note: See TracTickets for help on using tickets.
Back to Top