Merge pull request #832 from chrismedrela/ticket19890

Fixed #19890 -- ifchanged templatetag rendered its content twice
This commit is contained in:
Preston Holmes 2013-02-24 08:10:33 -08:00
commit e369dc2807
2 changed files with 15 additions and 2 deletions

View File

@ -223,6 +223,7 @@ class IfChangedNode(Node):
if self not in state_frame: if self not in state_frame:
state_frame[self] = None state_frame[self] = None
nodelist_true_output = None
try: try:
if self._varlist: if self._varlist:
# Consider multiple parameters. This automatically behaves # Consider multiple parameters. This automatically behaves
@ -230,13 +231,13 @@ class IfChangedNode(Node):
compare_to = [var.resolve(context, True) for var in self._varlist] compare_to = [var.resolve(context, True) for var in self._varlist]
else: else:
# The "{% ifchanged %}" syntax (without any variables) compares the rendered output. # The "{% ifchanged %}" syntax (without any variables) compares the rendered output.
compare_to = self.nodelist_true.render(context) compare_to = nodelist_true_output = self.nodelist_true.render(context)
except VariableDoesNotExist: except VariableDoesNotExist:
compare_to = None compare_to = None
if compare_to != state_frame[self]: if compare_to != state_frame[self]:
state_frame[self] = compare_to state_frame[self] = compare_to
return self.nodelist_true.render(context) return nodelist_true_output or self.nodelist_true.render(context) # render true block if not already rendered
elif self.nodelist_false: elif self.nodelist_false:
return self.nodelist_false.render(context) return self.nodelist_false.render(context)
return '' return ''

View File

@ -441,6 +441,18 @@ class Templates(TestCase):
output1 = template.render(Context({'foo': range(3), 'get_value': lambda: next(gen1)})) output1 = template.render(Context({'foo': range(3), 'get_value': lambda: next(gen1)}))
self.assertEqual(output1, '[0,1,2,3]', 'Expected [0,1,2,3] in first template, got {0}'.format(output1)) self.assertEqual(output1, '[0,1,2,3]', 'Expected [0,1,2,3] in first template, got {0}'.format(output1))
def test_ifchanged_render_once(self):
""" Test for ticket #19890. The content of ifchanged template tag was
rendered twice."""
template = Template('{% ifchanged %}{{ gen.next }}{% endifchanged %}')
def gen():
for i in xrange(1,10):
yield 'iteration no %d' % i
output = template.render(Context({'gen': gen()}))
self.assertEqual(output, 'iteration no 1')
def test_templates(self): def test_templates(self):
template_tests = self.get_template_tests() template_tests = self.get_template_tests()
filter_tests = filters.get_filter_tests() filter_tests = filters.get_filter_tests()