Commit 75bc5bc6 authored by Craig Oldford's avatar Craig Oldford Committed by Tim Graham
Browse files

Fixed #12199 -- Added the ability to use "as" with the firstof template tag.

parent 6023312d
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -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')
+7 −0
Original line number Diff line number Diff line
@@ -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
+3 −0
Original line number Diff line number Diff line
@@ -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
^^^^^^^^^^^^^^^^^^^^^^

+7 −0
Original line number Diff line number Diff line
@@ -81,3 +81,10 @@ class FirstOfTagTests(SimpleTestCase):
    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, '')