I had a really strange bug in one of my custom template tags today. It
took me the entire morning to figure it out, but I finally did. I'm
not sure if it's a bug or a feature, but I wanted to make a post to
help the next person who has this same problem.

Let's pretend you make a custom template tag foo. The render method
for foo is in a class FooNode, and you pass it a person from the
context.

{% foo persona %}
{% foo personb %}

Then, as is common, you have a list of people that you render with a
loop in the template.

{% for person in people %}
{% foo person %}
{% endfor %}

It turns out that when a template tag stands alone, the __init__ of
FooNode will be called each time the template tag appears. However,
when the template tag is inside of a loop, the __init__ of the FooNode
is only called once. That single instance of FooNode sticks around,
and it's render method is called over and over as the loop goes
around.

This doesn't seem like that big of a deal. However, my template tag
was written in such a way that data members of FooNode were being set
in the __init__ and reused in the render(). Because the initialization
only happened the first time through the loop, the template tag always
rendered as if it was for the first person in the list. Those data
members carried over to subsequent renders because the Node was not
reinitialized. I managed to fix it, but be aware. If your template
tags are behaving strangely when they are in loops, this is probably
the issue.

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-develop...@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to