Opened 4 months ago

Closed 4 months ago

Last modified 4 months ago

#35602 closed New feature (wontfix)

Allow simple_tag to be defined and used in a for loop

Reported by: Henrique Lacreta Alves Owned by:
Component: Template system Version: 4.2
Severity: Normal Keywords: tag, simple_tag, forloop
Cc: Henrique Lacreta Alves, Baptiste Mispelon, Tom Carrick, Carlton Gibson Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Currently, simple_tag cannot be used in the context of a loop, e.g.:
{% for object in simple_tag %}

I'm assuming this is not intended, because the following code works with a filter tag (and is the workaround to avoid having to create a new HTML template with inclusion tags):

{% for object in ""|filter_tag %}

This was tested in 4.2 version, not in 5.0 yet.

Change History (5)

comment:1 by Sarah Boyce, 4 months ago

Resolution: wontfix
Status: newclosed
Summary: Fix simple_tag use in for loopAllow simple_tag to be defined and used in a for loop
Type: BugNew feature

You're right, given a simple_tag like

@register.simple_tag(name="iterable")
def iterable(a, b):
    return a, b

You cannot do {% for object in iterable 1 2 %}{{ object }}{% endfor %} but you can do

{% iterable 1 2 as output %}{% for object in output %}{{ object }}{% endfor %}

I would class wanting to avoid using "as" to be a new feature request and if this is something you feel strongly about, you can discuss this on the Django forum and see if the community agrees with you.

Personally I'm not sure it's worth it

comment:2 by Henrique Lacreta Alves, 4 months ago

Fair point, I didn't consider using "as", and it does seem a bit of a stretch extending the use of "simple_tag" when such a simple solution already exists.

One thing I would consider though would be to add this as an example on Documentation. Using "simple_tag" as an iterable looks like a quite common scenario, and replacing it by an inclusion tag is an overkill most of the time. Do you think this would make sense/should I create a documentation suggestion?

comment:3 by Sarah Boyce, 4 months ago

Cc: Baptiste Mispelon Tom Carrick Carlton Gibson added
Keywords: forloop added

On your earlier point that {% for object in ""|filter_tag %} works, #19882 is related.
I might have been too hasty and am not sure whether this should be a bug as you originally thought. Going to invite some other opinions

Do you think this would make sense/should I create a documentation suggestion?

Possibly, though the docs for the as argument of simple_tag read quite well to me

comment:4 by Carlton Gibson, 4 months ago

Looking at the code for do_for(), this usage could never have been intended, so agreed it would be a new feature.

Would that be worthwhile? I'd want a proof-of-concept showing what it might look like before saying. (The existing as approach is perfectly serviceable, if arguably less fluent.)

comment:5 by Tom Carrick, 4 months ago

I've always known / thought that you can't use tags in other tags like this, but you can use filters. This seems like the expected behaviour to me. If it's worth doing or not, don't really have an opinion, I would suggest it's not really worth it as simple_tag already supports as, which is intended for this kind of thing.

And I think if we did this for simple_tag, people would undoubtedly wonder why it doesn't work for any tag, as they look identical in the template code. And that would be more effort, and would add to the allowed complexity of the template engine, which is against it's design ideals to keep templates simple (IMO). Better to put this type of logic in the view or use jinja if you need this kind of thing.

Improved docs are always nice, but I would say this isn't a bug.

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