Fixed #29060 -- Made {% firstof %} assign '' to the asvar if all inputs are false.

This commit is contained in:
Roger Gammans 2018-01-25 12:14:44 +00:00 committed by Tim Graham
parent 8dc675d90f
commit d0b44c44ef
2 changed files with 13 additions and 5 deletions

View File

@ -118,15 +118,16 @@ class FirstOfNode(Node):
self.asvar = asvar self.asvar = asvar
def render(self, context): def render(self, context):
first = ''
for var in self.vars: for var in self.vars:
value = var.resolve(context, ignore_failures=True) value = var.resolve(context, ignore_failures=True)
if value: if value:
first = render_value_in_context(value, context) first = render_value_in_context(value, context)
if self.asvar: break
context[self.asvar] = first if self.asvar:
return '' context[self.asvar] = first
return first return ''
return '' return first
class ForNode(Node): class ForNode(Node):

View File

@ -82,3 +82,10 @@ class FirstOfTagTests(SimpleTestCase):
output = self.engine.render_to_string('firstof15', ctx) output = self.engine.render_to_string('firstof15', ctx)
self.assertEqual(ctx['myvar'], '2') self.assertEqual(ctx['myvar'], '2')
self.assertEqual(output, '') self.assertEqual(output, '')
@setup({'firstof16': '{% firstof a b c as myvar %}'})
def test_all_false_arguments_asvar(self):
ctx = {'a': 0, 'b': 0, 'c': 0}
output = self.engine.render_to_string('firstof16', ctx)
self.assertEqual(ctx['myvar'], '')
self.assertEqual(output, '')