Comments (6)
This was never supposed to work though. The correct syntax for this case would always have been this:
{{ (someobj|string)[:16] }}
Now I might finally properly support that in a new patch release, but there is a reason why subscriptions are not supposed on filters: they are confusing. Because filter names can contain dots, this for instance would not be valid at all:
{{ soneobj|string.upper() }}
This will give an exception that there is no filter named upper. Again, I am fine changing so that foo|filter[foo]
works, but I think it's not a bad idea to change this behavior. I agree that this should not have been done on a patchlevel release, but this was caused by a bugfix for another syntax problem with priorities.
The core issue is that filters have completely different binding rules and are designed to support filter chaining. However there is actually currently one expression that can be applied after filters: calls. This is also was not a very clever design principle, but it was tested and supported earlier on.
I suppose a possible fix would be fixing this in 2.5.6 and then introducing a deprecation warning in 2.6 for both function calls after filters that are not using parentheses and {{ foo|string[42] }}
instead of {{ (foo|string)[42] }}
.
Would this be a possible upgrade path?
from jinja.
Generally that problem arises because foo.bar
is supposed to be mostly equivalent to foo['bar']
and that cannot be achieved for filters due to their ability to have dotted names. And I don't want to introduce context-sensitive exceptions.
from jinja.
Actually, one might solve that ambiguity also by using explicit parentheses on the filter if I would make it possible to use [...]
after filters:
{{ foo|string().upper() }}
Not sure how nice this looks on the eyes though. What would be the use case for subscribing after the filter in your case? If it's common enough I see no reason in deprecating that functionality in general.
from jinja.
I'm ok with using the syntax (foo|string)[:16]
The deprecation path through 2.5.6 / 2.6 may be safer probably.
from jinja.
Another usecase that came up is this:
{%- for c in current_category.fullpath|list[:-1] -%}
from jinja.
Closing this off since it appears as though the recommended way of doing this is to wrap the expression in ()
before slicing it.
I can confirm that this issue still exists on 2.10.x though.
from jinja.
Related Issues (20)
- Indent filter fails confusing if input is not string HOT 3
- test_striptags regressed with markupsafe 2.1.4 HOT 1
- Is it not possible to utilize a test adorned with the @pass_context decorator in the select function?
- add sort_keys argument to `tojson` filter HOT 2
- `tojson` always do autoescape HOT 2
- Native types in macros works for list but does not work for int HOT 2
- Template globals not visible in {% import %}'ed file when it's {% include %}'ed by another file HOT 2
- Flake8 error B036 reported by updated flake8-bugbear version HOT 1
- urlize support for quotes
- A loader was not found
- filters.map: apply filter to attribute ("mapattr")
- Template.render changelog is documented as using asyncio.run but does not
- no way to explicitly shutdown async generators HOT 1
- generate_async type annotation does not support `.aclose()`
- root_render_func not properly aclosed in Template.generate_async
- Jinja strips trailing newline
- Allow to customize some behaviors of Lexer, so that Extension instances get can the raw block begin and end info.
- Optional literal eval on native environments HOT 1
- Option to preserve comments in the AST HOT 2
- refactor `PackageLoader` to use `importlib.resources` HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jinja.