Skip to content

Commit

Permalink
Fixed django#12199 -- Added the ability to use "as" with the firstof …
Browse files Browse the repository at this point in the history
…template tag.
  • Loading branch information
cristojreyes authored and timgraham committed Apr 14, 2015
1 parent 6023312 commit 75bc5bc
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 4 deletions.
18 changes: 14 additions & 4 deletions django/template/defaulttags.py
Expand Up @@ -110,14 +110,19 @@ def render(self, context):


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 ''


Expand Down Expand Up @@ -748,7 +753,7 @@ def firstof(parser, token):
Sample usage::
{% firstof var1 var2 var3 %}
{% firstof var1 var2 var3 as myvar %}
This is equivalent to::
Expand Down Expand Up @@ -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')
Expand Down
7 changes: 7 additions & 0 deletions docs/ref/templates/builtins.txt
Expand Up @@ -285,6 +285,13 @@ Or if only some variables should be escaped, you can use::

{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}

You can use the syntax ``{% firstof var1 var2 var3 as value %}`` to store the
output inside a variable.

.. versionadded:: 1.9

The "as" syntax was added.

.. templatetag:: for

for
Expand Down
3 changes: 3 additions & 0 deletions docs/releases/1.9.txt
Expand Up @@ -208,6 +208,9 @@ Templates
* A warning will now be logged for missing context variables. These messages
will be logged to the :ref:`django.template <django-template-logger>` logger.

* The :ttag:`firstof` template tag supports storing the output in a variable
using 'as'.

Requests and Responses
^^^^^^^^^^^^^^^^^^^^^^

Expand Down
7 changes: 7 additions & 0 deletions tests/template_tests/syntax_tests/test_firstof.py
Expand Up @@ -81,3 +81,10 @@ def test_firstof13(self):
def test_firstof14(self):
output = self.engine.render_to_string('firstof14', {'a': '<'})
self.assertEqual(output, '<')

@setup({'firstof15': '{% firstof a b c as myvar %}'})
def test_firstof15(self):
ctx = {'a': 0, 'b': 2, 'c': 3}
output = self.engine.render_to_string('firstof15', ctx)
self.assertEqual(ctx['myvar'], '2')
self.assertEqual(output, '')

0 comments on commit 75bc5bc

Please sign in to comment.