[Django] #34124: Developer experience on {% with %} template tag can be improved.

8 views
Skip to first unread message

Django

unread,
Oct 27, 2022, 11:49:29 AM10/27/22
to django-...@googlegroups.com
#34124: Developer experience on {% with %} template tag can be improved.
-------------------------------------+-------------------------------------
Reporter: oscarmcm | Owner: nobody
Type: | Status: new
Cleanup/optimization |
Component: Template | Version: 4.1
system |
Severity: Normal | Keywords: template tag
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
The "with" template tag just caches a complex variable under a simpler
name, and from the Django Documentation we know that there's two ways to
use this tag:

- normal form
{{{
{% with alpha=1 beta=2 %}
{% endwith %}
}}}

- verbose form
{{{
{% with business.employees.count as total %}
{% endwith %}
}}}

But recently I was reviewing some code and found this:

{{{
{% with first_post_image as post_images.first.image %}
...
{% endwith %}
}}}

As we can see the order of the parameters is wrong, I was a bit surprised
that the Django template engine did not throw or raised an issue while
trying to render the template, and in the same way I think the ticket
#32157 is directly related to this. So I believe that we can improve the
DX for this template tag and enforce the values that we want to cache,
this means that we should allow only valid variable names and enforce
value casting.

--
Ticket URL: <https://code.djangoproject.com/ticket/34124>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Oct 28, 2022, 4:32:34 AM10/28/22
to django-...@googlegroups.com
#34124: Developer experience on {% with %} template tag can be improved.
-------------------------------------+-------------------------------------
Reporter: Oscar Cortez | Owner: nobody
Type: | Status: closed
Cleanup/optimization |
Component: Template system | Version: 4.1
Severity: Normal | Resolution: wontfix

Keywords: template tag | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Mariusz Felisiak):

* status: new => closed
* resolution: => wontfix


Comment:

Thanks for the report.

> So I believe that we can improve the DX for this template tag and
enforce the values that we want to cache, this means that we should allow
only valid variable names and enforce value casting.

Unfortunately, we cannot do this without breaking backward compatibility
as not only valid identifiers are not supported, e.g.
{{{
{% with key as 123żółć %}{{ 123żółć }}|{{key}}{% endwith %}
}}}
works fine. Moreover, even dotted names, e.g. `post_images.first.image`,
are added to the `context` (as `context["post_images.first.image"] = "some
value"`) so they can be accessed by custom template tags (seems unlikely
but...). I don't think it's worth additional complexity.

If you don't agree, please first start a discussion on the
DevelopersMailingList, where you'll reach a wider audience and see what
other think, and
[https://docs.djangoproject.com/en/stable/internals/contributing/triaging-
tickets/#closing-tickets follow the triaging guidelines with regards to
wontfix tickets].

--
Ticket URL: <https://code.djangoproject.com/ticket/34124#comment:1>

Django

unread,
Nov 1, 2022, 10:12:55 AM11/1/22
to django-...@googlegroups.com
#34124: Developer experience on {% with %} template tag can be improved.
-------------------------------------+-------------------------------------
Reporter: Oscar Cortez | Owner: nobody
Type: | Status: closed
Cleanup/optimization |
Component: Template system | Version: 4.1
Severity: Normal | Resolution: wontfix
Keywords: template tag | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by Adam Johnson):

I think using logging options for missing variable errors should also
catch the problematic situation. I blogged about ways to use this:
https://adamj.eu/tech/2022/03/30/how-to-make-django-error-for-undefined-
template-variables/

--
Ticket URL: <https://code.djangoproject.com/ticket/34124#comment:2>

Reply all
Reply to author
Forward
0 new messages