Opened 16 years ago

Closed 14 years ago

#5971 closed (fixed)

django.template.TokenParser inconsistent with parsing filters

Reported by: Dmitri Fedortchenko <zeraien@…> Owned by: nobody
Component: Template system Version: dev
Severity: Keywords: template filter
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Malcolm Tredinnick)

django.template.TokenParser is inconsistent
when parsing filters that follow constant strings or variables.

Meaning that:

{% tag thevar|filter sometag %}

will produce:

self.value() = "thevar|filter"
self.tag() = "sometag"

However:

{% tag "a value"|filter sometag %}

will produce:

self.value() = "a value"
self.tag() = "|filter"
self.tag() = "sometag"

This does not seem like correct behaviour...
I made a very simple patch for this, thus the outcome of the above:

{% tag "a value"|filter sometag %}

will produce:

value = "a value"|filter
tag = sometag

So now we can simply pass the "value" into a FilterExpression to parse the filters...

PS: I had trouble naming an internal method, feel free to complain about the name ;)

Attachments (4)

tokenparser_filter_fix.diff (2.4 KB ) - added by Dmitri Fedortchenko <zeraien@…> 16 years ago.
The patch
tests_for_5971.diff (1.1 KB ) - added by Adam Vandenberg 16 years ago.
5971-tokenparser-consistency-r10001.diff (3.3 KB ) - added by Ramiro Morales 15 years ago.
Unified and updated patches (implementation bt Dmitri Fedortchenko and tests by adamv)
5971-parser_consistency_literals_and_filters-r10246.diff (4.2 KB ) - added by Ramiro Morales 15 years ago.
Patch updated to port r10118

Download all attachments as: .zip

Change History (9)

by Dmitri Fedortchenko <zeraien@…>, 16 years ago

Attachment: tokenparser_filter_fix.diff added

The patch

comment:1 by Dmitri Fedortchenko <zeraien@…>, 16 years ago

django.template.TokenParser is inconsistent when parsing filters that follow constant strings or variables.

Meaning that {% tag thevar|filter sometag %} will produce:

self.value() = "thevar|filter"
self.tag() = "sometag"

However {% tag "a value"|filter sometag %} will produce:

self.value() = "a value"
self.tag() = "|filter"
self.tag() = "sometag"

This does not seem like correct behaviour... I made a very simple patch for this, thus the outcome of the above:

{% tag "a value"|filter sometag %} will produce:
self.value() = "a value"|filter
self.tag() = sometag

So now we can simply pass the "value" into a FilterExpression? to parse the filters...

See this thread:
http://groups.google.com/group/django-developers/browse_thread/thread/c90b6e29d20724ca

PS: I should learn to use the preview button.
PPS: The self is from the perspective of the implementee of the TokenParser class.

comment:2 by Malcolm Tredinnick, 16 years ago

Description: modified (diff)
Triage Stage: UnreviewedAccepted

Fixed description formatting.

comment:3 by Gary Wilson, 16 years ago

Needs tests: set

by Adam Vandenberg, 16 years ago

Attachment: tests_for_5971.diff added

by Ramiro Morales, 15 years ago

Unified and updated patches (implementation bt Dmitri Fedortchenko and tests by adamv)

by Ramiro Morales, 15 years ago

Patch updated to port r10118

comment:4 by Ramiro Morales, 15 years ago

Needs tests: unset

I've update the patch to expand regressiontests/template/parser.py (added in r10118) rather than adding a regressiontests/tokenparser/ subdir.

While at it, also made sure the variable_parsing doctests get executed, they had been added in that revision but weren't being run.

comment:5 by Jannis Leidel, 14 years ago

Resolution: fixed
Status: newclosed

(In [12471]) Fixed #5971 - Fixed inconsistent behaviour of the TokenParser when parsing filters that follow constant strings or variables. Thanks Dmitri Fedortchenko, Adam Vandenberg and Ramiro Morales.

Note: See TracTickets for help on using tickets.
Back to Top