commit da3621d572be50292d73ce3fb5b51b2eb3754a76
Author: U-frozen\lreqc <lreqc@frozen.(none)>
Date:   Sat Sep 25 03:16:12 2010 +0200

    First version of the patch.

diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py
index 1b07413..687a744 100644
--- a/django/template/defaulttags.py
+++ b/django/template/defaulttags.py
@@ -53,13 +53,17 @@ class CsrfTokenNode(Node):
             return u''
 
 class CycleNode(Node):
-    def __init__(self, cyclevars, variable_name=None):
+    def __init__(self, cyclevars, variable_name=None, silent=False):
         self.cyclevars = cyclevars
         self.variable_name = variable_name
+        self.silent = silent
 
     def render(self, context):
         if self not in context.render_context:
+            # First time the node is rendered in template
             context.render_context[self] = itertools_cycle(self.cyclevars)
+            if self.silent:
+                return ''
         cycle_iter = context.render_context[self]
         value = cycle_iter.next().resolve(context)
         if self.variable_name:
@@ -482,6 +486,17 @@ def cycle(parser, token):
     You can use any number of values, separated by spaces. Commas can also
     be used to separate values; if a comma is used, the cycle values are
     interpreted as literal strings.
+
+    The optional flag "silent" can be used to prevent the cycle declaration
+    from returning any value::
+
+        {% cycle 'row1' 'row2' as rowcolors silent %}{# no value here #}
+        {% for o in some_list %}
+            <tr class="{% cycle rowcolors %}">{# first value will be "row1" #}
+                ...
+            </tr>
+        {% endfor %}
+
     """
 
     # Note: This returns the exact same node on each {% cycle name %} call;
@@ -513,10 +528,24 @@ def cycle(parser, token):
             raise TemplateSyntaxError("Named cycle '%s' does not exist" % name)
         return parser._namedCycleNodes[name]
 
-    if len(args) > 4 and args[-2] == 'as':
+    as_form = False
+
+    if len(args) > 4:
+        # {% cycle ... as foo [silent] %} case.
+        if args[-3] == "as":
+            if args[-1] != "silent":
+                raise TemplateSyntaxError("Only 'silent' flag is allowed after cycle's name, not '%s'." % args[-1])
+            as_form = True
+            silent = True
+            args = args[:-1]
+        elif args[-2] == "as":
+            as_form = True
+            silent = False
+
+    if as_form:
         name = args[-1]
         values = [parser.compile_filter(arg) for arg in args[1:-2]]
-        node = CycleNode(values, name)
+        node = CycleNode(values, name, silent=silent)
         if not hasattr(parser, '_namedCycleNodes'):
             parser._namedCycleNodes = {}
         parser._namedCycleNodes[name] = node
diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt
index 85c0b6d..f0c23c2 100644
--- a/docs/ref/templates/builtins.txt
+++ b/docs/ref/templates/builtins.txt
@@ -140,6 +140,26 @@ 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?
 
+.. versionadded:: 1.3
+
+By default, the cycle tag with "as" keyword will output the first value
+of a cycle. This could be a problem if you want to use the value in a nested
+loop or an included template. You can add a "silent" flag
+and the end to prevent the output::
+
+    * Template::
+
+        {% for item in item_list %}
+            {% cycle 'black' 'red' as item_class silent %}
+            {% include "item.html" %}
+        {% endfor %}
+
+    * The ``item.html`` template::
+
+        <div class="{{ item_class }}">...</div>
+
+This will produce a sequence of divs with first one having class "black".
+
 .. templatetag:: debug
 
 debug
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py
index bbbcae3..c7c4b0f 100644
--- a/tests/regressiontests/templates/tests.py
+++ b/tests/regressiontests/templates/tests.py
@@ -646,6 +646,9 @@ class Templates(unittest.TestCase):
             'cycle14': ("{% cycle one two as foo %}{% cycle foo %}", {'one': '1','two': '2'}, '12'),
             'cycle15': ("{% for i in test %}{% cycle aye bee %}{{ i }},{% endfor %}", {'test': range(5), 'aye': 'a', 'bee': 'b'}, 'a0,b1,a2,b3,a4,'),
             'cycle16': ("{% cycle one|lower two as foo %}{% cycle foo %}", {'one': 'A','two': '2'}, 'a2'),
+            'cycle17': ("{% cycle 'a' 'b' 'c' as abc silent %}{% cycle abc %}{% cycle abc %}{% cycle abc %}{% cycle abc %}", {}, "abca"),
+            'cycle18': ("{% cycle 'a' 'b' 'c' as foo invalid_flag %}", {}, template.TemplateSyntaxError),
+            'cycle19': ("{% cycle 'a' 'b' as silent %}{% cycle silent %}", {}, "ab"),
 
             ### EXCEPTIONS ############################################################
 
