Fixed #28001 -- Updated comment and tested context popping in ForNode.render().

This commit is contained in:
kapil garg 2017-04-07 04:34:29 +05:30 committed by Tim Graham
parent 351835f262
commit dbfcedb499
2 changed files with 20 additions and 5 deletions

View File

@ -211,11 +211,9 @@ class ForNode(Node):
nodelist.append(node.render_annotated(context))
if pop_context:
# The loop variables were pushed on to the context so pop them
# off again. This is necessary because the tag lets the length
# of loopvars differ to the length of each set of items and we
# don't want to leave any vars from the previous loop on the
# context.
# Pop the loop variables pushed on to the context to avoid
# the context ending up in an inconsistent state when other
# tags (e.g., include and with) push data to context.
context.pop()
return mark_safe(''.join(nodelist))

View File

@ -180,3 +180,20 @@ class ForTagTests(SimpleTestCase):
def test_for_tag_unpack14(self):
with self.assertRaisesMessage(ValueError, 'Need 2 values to unpack in for loop; got 1.'):
self.engine.render_to_string('for-tag-unpack14', {'items': (1, 2)})
@setup({
'main': '{% with alpha=alpha.values %}{% include "base" %}{% endwith %}_'
'{% with alpha=alpha.extra %}{% include "base" %}{% endwith %}',
'base': '{% for x, y in alpha %}{{ x }}:{{ y }},{% endfor %}'
})
def test_for_tag_context(self):
"""
ForNode.render() pops the values it pushes to the context (#28001).
"""
output = self.engine.render_to_string('main', {
'alpha': {
'values': [('two', 2), ('four', 4)],
'extra': [('six', 6), ('eight', 8)],
},
})
self.assertEqual(output, 'two:2,four:4,_six:6,eight:8,')