From 75bc5bc634e90d5ccd2d7fc324df878dc5d4ce5d Mon Sep 17 00:00:00 2001 From: Craig Oldford Date: Mon, 13 Apr 2015 12:27:30 -0300 Subject: Fixed #12199 -- Added the ability to use "as" with the firstof template tag. --- django/template/defaulttags.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'django') diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index 6c0bf60094..60d6839ca5 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -110,14 +110,19 @@ class FilterNode(Node): class FirstOfNode(Node): - def __init__(self, variables): + def __init__(self, variables, asvar=None): self.vars = variables + self.asvar = asvar def render(self, context): for var in self.vars: value = var.resolve(context, True) if value: - return render_value_in_context(value, context) + first = render_value_in_context(value, context) + if self.asvar: + context[self.asvar] = first + return '' + return first return '' @@ -748,7 +753,7 @@ def firstof(parser, token): Sample usage:: - {% firstof var1 var2 var3 %} + {% firstof var1 var2 var3 as myvar %} This is equivalent to:: @@ -779,9 +784,14 @@ def firstof(parser, token): """ bits = token.split_contents()[1:] + asvar = None if len(bits) < 1: raise TemplateSyntaxError("'firstof' statement requires at least one argument") - return FirstOfNode([parser.compile_filter(bit) for bit in bits]) + + if len(bits) >= 2 and bits[-2] == 'as': + asvar = bits[-1] + bits = bits[:-2] + return FirstOfNode([parser.compile_filter(bit) for bit in bits], asvar) @register.tag('for') -- cgit v1.3