Skip to content

Commit

Permalink
Merge pull request #832 from chrismedrela/ticket19890
Browse files Browse the repository at this point in the history
Fixed #19890 -- ifchanged templatetag rendered its content twice
  • Loading branch information
ptone committed Feb 24, 2013
2 parents d546259 + 636c45f commit e369dc2
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
5 changes: 3 additions & 2 deletions django/template/defaulttags.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,20 +223,21 @@ def render(self, context):
if self not in state_frame:
state_frame[self] = None

nodelist_true_output = None
try:
if self._varlist:
# Consider multiple parameters. This automatically behaves
# like an OR evaluation of the multiple variables.
compare_to = [var.resolve(context, True) for var in self._varlist]
else:
# 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:
compare_to = None

if compare_to != state_frame[self]:
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:
return self.nodelist_false.render(context)
return ''
Expand Down
12 changes: 12 additions & 0 deletions tests/regressiontests/templates/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,18 @@ def gen():
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))

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):
template_tests = self.get_template_tests()
filter_tests = filters.get_filter_tests()
Expand Down

0 comments on commit e369dc2

Please sign in to comment.