Commit c36b6083 authored by Tim Graham's avatar Tim Graham
Browse files

Fixed #24451 -- Deprecated comma-separated {% cycle %} syntax.

parent 88c605e3
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -654,6 +654,10 @@ def cycle(parser, token):
        raise TemplateSyntaxError("'cycle' tag requires at least two arguments")

    if ',' in args[1]:
        warnings.warn(
            "The old {% cycle %} syntax with comma-separated arguments is deprecated.",
            RemovedInDjango20Warning,
        )
        # Backwards compatibility: {% cycle a,b %} or {% cycle a,b as foo %}
        # case.
        args[1:2] = ['"%s"' % arg for arg in args[1].split(",")]
+3 −0
Original line number Diff line number Diff line
@@ -187,6 +187,9 @@ details on these changes.
  from ``allow_migrate(self, db, model)`` to
  ``allow_migrate(self, db, app_label, model_name=None, **hints)``.

* Support for the syntax of ``{% cycle %}`` that uses comma-separated arguments
  will be removed.

.. _deprecation-removed-in-1.9:

1.9
+8 −8
Original line number Diff line number Diff line
@@ -185,17 +185,17 @@ call to ``{% cycle %}`` doesn't specify ``silent``::
    {% cycle 'row1' 'row2' as rowcolors silent %}
    {% cycle rowcolors %}

For backward compatibility, the ``{% cycle %}`` tag supports the much inferior
old syntax from previous Django versions. You shouldn't use this in any new
projects, but for the sake of the people who are still using it, here's what it
looks like::
.. deprecated:: 1.9

    {% cycle row1,row2,row3 %}
    The ``{% cycle %}`` tag supports the much inferior old syntax from previous
    Django versions. You shouldn't use this in any new projects, but for the
    sake of the people who are still using it, here's what it looks like::

In this syntax, each value gets interpreted as a literal string, and there's no
way to specify variable values. Or literal commas. Or spaces. Did we mention
you shouldn't use this syntax in any new projects?
        {% cycle row1,row2,row3 %}

    In this syntax, each value gets interpreted as a literal string, and there's
    no way to specify variable values, literal commas, or spaces. Support for
    this syntax will be removed in Django 2.0.

.. templatetag:: debug

+13 −0
Original line number Diff line number Diff line
@@ -277,6 +277,19 @@ template tags that store results in a template variable. The
ability, making the ``assignment_tag`` obsolete. Tags that use
``assignment_tag`` should be updated to use ``simple_tag``.

``{% cycle %}`` syntax with comma-separated arguments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The :ttag:`cycle` tag supports an inferior old syntax from previous Django
versions:

.. code-block:: html+django

    {% cycle row1,row2,row3 %}

Its parsing caused bugs with the current syntax, so support for the old syntax
will be removed in Django 2.0 following an accelerated deprecation.

Miscellaneous
~~~~~~~~~~~~~

+6 −0
Original line number Diff line number Diff line
@@ -12,16 +12,19 @@ class CycleTagTests(SimpleTestCase):
        with self.assertRaises(TemplateSyntaxError):
            self.engine.get_template('cycle01')

    @ignore_warnings(category=RemovedInDjango20Warning)
    @setup({'cycle02': '{% cycle a,b,c as abc %}{% cycle abc %}'})
    def test_cycle02(self):
        output = self.engine.render_to_string('cycle02')
        self.assertEqual(output, 'ab')

    @ignore_warnings(category=RemovedInDjango20Warning)
    @setup({'cycle03': '{% cycle a,b,c as abc %}{% cycle abc %}{% cycle abc %}'})
    def test_cycle03(self):
        output = self.engine.render_to_string('cycle03')
        self.assertEqual(output, 'abc')

    @ignore_warnings(category=RemovedInDjango20Warning)
    @setup({'cycle04': '{% cycle a,b,c as abc %}{% cycle abc %}{% cycle abc %}{% cycle abc %}'})
    def test_cycle04(self):
        output = self.engine.render_to_string('cycle04')
@@ -37,16 +40,19 @@ class CycleTagTests(SimpleTestCase):
        with self.assertRaises(TemplateSyntaxError):
            self.engine.get_template('cycle06')

    @ignore_warnings(category=RemovedInDjango20Warning)
    @setup({'cycle07': '{% cycle a,b,c as foo %}{% cycle bar %}'})
    def test_cycle07(self):
        with self.assertRaises(TemplateSyntaxError):
            self.engine.get_template('cycle07')

    @ignore_warnings(category=RemovedInDjango20Warning)
    @setup({'cycle08': '{% cycle a,b,c as foo %}{% cycle foo %}{{ foo }}{{ foo }}{% cycle foo %}{{ foo }}'})
    def test_cycle08(self):
        output = self.engine.render_to_string('cycle08')
        self.assertEqual(output, 'abbbcc')

    @ignore_warnings(category=RemovedInDjango20Warning)
    @setup({'cycle09': '{% for i in test %}{% cycle a,b %}{{ i }},{% endfor %}'})
    def test_cycle09(self):
        output = self.engine.render_to_string('cycle09', {'test': list(range(5))})
Loading