On Wed, May 5, 2010 at 4:27 PM, Apreche <apre...@gmail.com> wrote:
> Well, I think my suggestion is obviously that when a template tag is
> in a loop, it should be re-initiated on every iteration, since that
> would avoid unexpected and non-obvious side effects.
>
> -Scott
>
> On May 5, 2:52 pm, "burc...@gmail.com" <burc...@gmail.com> wrote:
>> Hi Apreche,
>>
>> I don't want to be rude, but you probably wanted to send this to
>> django-users, it is the place full of users of django framework who
>> should be aware of your problem and this point of confusion (hm, or
>> should it be blog post so everyone can google on their problem and
>> find your message?).
>> Everyone here in django-dev assumes that you have suggestion to fix
>> something in django if you're writing here.
>> Probably, you might suggest to improve django documentation where it
>> explains how to create custom template tags.
>> It seems you're really good at writing documentation!
>> Then, please, go on, improve the current documentation text, create a
>> ticket, and send your patch.
>>
>>
>>
>> On Wed, May 5, 2010 at 10:12 PM, Apreche <apre...@gmail.com> wrote:
>> > 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.
>>
>> --
>> Best regards, Yuri V. Baburov, ICQ# 99934676, Skype: yuri.baburov,
>> MSN: bu...@live.com
>>
>> --
>> 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 
>> athttp://groups.google.com/group/django-developers?hl=en.
>
> --
> 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.
>
>

No.  Template tags are initialized at compile time, not at execution
time.  Anything that requires global state should be done in the
render method.

Alex

-- 
"I disapprove of what you say, but I will defend to the death your
right to say it." -- Voltaire
"The people's good is the highest law." -- Cicero
"Code can always be simpler than you think, but never as simple as you
want" -- Me

-- 
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