Index: django/template/defaulttags.py
===================================================================
--- django/template/defaulttags.py	(revision 4541)
+++ django/template/defaulttags.py	(working copy)
@@ -58,8 +58,8 @@
         return ''
 
 class ForNode(Node):
-    def __init__(self, loopvar, sequence, reversed, nodelist_loop):
-        self.loopvar, self.sequence = loopvar, sequence
+    def __init__(self, loopvars, sequence, reversed, nodelist_loop):
+        self.loopvars, self.sequence = loopvars, sequence
         self.reversed = reversed
         self.nodelist_loop = nodelist_loop
 
@@ -69,7 +69,7 @@
         else:
             reversed = ''
         return "<For Node: for %s in %s, tail_len: %d%s>" % \
-            (self.loopvar, self.sequence, len(self.nodelist_loop), reversed)
+            (', '.join( self.loopvars ), self.sequence, len(self.nodelist_loop), reversed)
 
     def __iter__(self):
         for node in self.nodelist_loop:
@@ -117,7 +117,8 @@
                 'last': (i == len_values - 1),
                 'parentloop': parentloop,
             }
-            context[self.loopvar] = item
+            context.update( dict( zip(self.loopvars, item) ) )
+            #context[self.loopvar] = item
             for node in self.nodelist_loop:
                 nodelist.append(node.render(context))
         context.pop()
@@ -523,18 +524,28 @@
 
     """
     bits = token.contents.split()
-    if len(bits) == 5 and bits[4] != 'reversed':
-        raise TemplateSyntaxError, "'for' statements with five words should end in 'reversed': %s" % token.contents
-    if len(bits) not in (4, 5):
-        raise TemplateSyntaxError, "'for' statements should have either four or five words: %s" % token.contents
-    if bits[2] != 'in':
-        raise TemplateSyntaxError, "'for' statement must contain 'in' as the second word: %s" % token.contents
-    loopvar = bits[1]
-    sequence = parser.compile_filter(bits[3])
-    reversed = (len(bits) == 5)
+    #if len(bits) == 5 and bits[4] != 'reversed':
+    #    raise TemplateSyntaxError, "'for' statements with five words should end in 'reversed': %s" % token.contents
+    if len(bits) < 4:
+        raise TemplateSyntaxError, "'for' statements should have at leat four words: %s" % token.contents
+
+    try:
+        in_index = bits.index('in')
+    except ValueError:
+        raise TemplateSyntaxError, "'for' statement must contain 'in': %s" % token.contents
+
+    loopvars = []
+    for bit in bits[1:in_index]:
+        if bit.find(',') == -1:
+            loopvars.append( bit )
+        elif len(bit) > 1:
+            loopvars.extend( bit.split(',') )
+
+    sequence = parser.compile_filter(bits[in_index+1])
+    reversed = ( bits[-1] == 'reversed' )
     nodelist_loop = parser.parse(('endfor',))
     parser.delete_first_token()
-    return ForNode(loopvar, sequence, reversed, nodelist_loop)
+    return ForNode(loopvars, sequence, reversed, nodelist_loop)
 do_for = register.tag("for", do_for)
 
 def do_ifequal(parser, token, negate):
