Index: django/template/defaulttags.py
===================================================================
--- django/template/defaulttags.py	(revision 7020)
+++ django/template/defaulttags.py	(working copy)
@@ -84,10 +84,10 @@
         return u''
 
 class ForNode(Node):
-    def __init__(self, loopvars, sequence, is_reversed, nodelist_loop):
+    def __init__(self, loopvars, sequence, is_reversed, nodelist_loop, nodelist_default):
         self.loopvars, self.sequence = loopvars, sequence
         self.is_reversed = is_reversed
-        self.nodelist_loop = nodelist_loop
+        self.nodelist_loop, self.nodelist_default = nodelist_loop, nodelist_default
 
     def __repr__(self):
         reversed_text = self.is_reversed and ' reversed' or ''
@@ -98,12 +98,15 @@
     def __iter__(self):
         for node in self.nodelist_loop:
             yield node
+        for node in self.nodelist_default:
+            yield node
 
     def get_nodes_by_type(self, nodetype):
         nodes = []
         if isinstance(self, nodetype):
             nodes.append(self)
         nodes.extend(self.nodelist_loop.get_nodes_by_type(nodetype))
+        nodes.extend(self.nodelist_default.get_nodes_by_type(nodetype))
         return nodes
 
     def render(self, context):
@@ -122,6 +125,8 @@
         if not hasattr(values, '__len__'):
             values = list(values)
         len_values = len(values)
+        if len_values < 1:
+            return self.nodelist_default.render(context)
         if self.is_reversed:
             values = reversed(values)
         unpack = len(self.loopvars) > 1
@@ -575,7 +580,7 @@
 #@register.tag(name="for")
 def do_for(parser, token):
     """
-    Loops over each item in an array.
+    Loops over each item in an array, with support of ``else``.
 
     For example, to display a list of athletes given ``athlete_list``::
 
@@ -594,6 +599,17 @@
             {{ key }}: {{ value }}
         {% endfor %}
 
+    As you can see, the ``for`` tag can take an option ``{% default %}`` clause
+    that will be displayed if the given array is empty::
+
+        <ul>
+        {% for athlete in athlete_list %}
+            <li>{{ athlete.name }}</li>
+        {% default %}
+            <li>Sorry, no athlete in this list!</li>
+        {% endfor %}
+        <ul>
+
     The for loop sets a number of variables available within the loop:
 
         ==========================  ================================================
@@ -630,9 +646,14 @@
                                       " %s" % token.contents)
 
     sequence = parser.compile_filter(bits[in_index+1])
-    nodelist_loop = parser.parse(('endfor',))
-    parser.delete_first_token()
-    return ForNode(loopvars, sequence, is_reversed, nodelist_loop)
+    nodelist_loop = parser.parse(('default', 'endfor',))
+    token = parser.next_token()
+    if token.contents == 'default':
+        nodelist_default = parser.parse(('endfor',))
+        parser.delete_first_token()
+    else:
+        nodelist_default = NodeList()
+    return ForNode(loopvars, sequence, is_reversed, nodelist_loop, nodelist_default)
 do_for = register.tag("for", do_for)
 
 def do_ifequal(parser, token, negate):
Index: docs/templates.txt
===================================================================
--- docs/templates.txt	(revision 7020)
+++ docs/templates.txt	(working copy)
@@ -717,6 +717,18 @@
         {{ key }}: {{ value }}
     {% endfor %}
 
+**New in Django development version**
+As you can see, the ``for`` tag can take an optional ``{% default %}`` clause
+that will be displayed if the given array is empty::
+
+    <ul>
+    {% for athlete in athlete_list %}
+        <li>{{ athlete.name }}</li>
+    {% default %}
+        <li>Sorry, no athlete in this list!</li>
+    {% endfor %}
+    <ul>
+
 The for loop sets a number of variables available within the loop:
 
     ==========================  ================================================
