Index: django/newforms/forms.py
===================================================================
--- django/newforms/forms.py	(revision 6822)
+++ django/newforms/forms.py	(working copy)
@@ -195,8 +195,6 @@
             self.cleaned_data = self.clean()
         except ValidationError, e:
             self._errors[NON_FIELD_ERRORS] = e.messages
-        if self._errors:
-            delattr(self, 'cleaned_data')
 
     def clean(self):
         """
@@ -290,8 +288,13 @@
     def _data(self):
         """
         Returns the data for this BoundField, or None if it wasn't given.
+        If the data has been cleaned, that value is used; otherwise, the value
+        is provided by value_from_datadict.
         """
-        return self.field.widget.value_from_datadict(self.form.data, self.form.files, self.html_name)
+        if hasattr(self.form, 'cleaned_data') and self.name in self.form.cleaned_data:
+            return self.form.cleaned_data[self.name]
+        else:
+            return self.field.widget.value_from_datadict(self.form.data, self.form.files, self.html_name)
     data = property(_data)
 
     def label_tag(self, contents=None, attrs=None):
Index: tests/modeltests/model_forms/models.py
===================================================================
--- tests/modeltests/model_forms/models.py	(revision 6822)
+++ tests/modeltests/model_forms/models.py	(working copy)
@@ -163,9 +163,7 @@
 >>> f.errors
 {'name': [u'This field is required.'], 'slug': [u'This field is required.']}
 >>> f.cleaned_data
-Traceback (most recent call last):
-...
-AttributeError: 'CategoryForm' object has no attribute 'cleaned_data'
+{'url': u'foo'}
 >>> f.save()
 Traceback (most recent call last):
 ...
Index: tests/regressiontests/forms/extra.py
===================================================================
--- tests/regressiontests/forms/extra.py	(revision 6822)
+++ tests/regressiontests/forms/extra.py	(working copy)
@@ -159,7 +159,7 @@
 rendering as well.
 
 >>> print a['mydate'].as_hidden()
-<input type="hidden" name="mydate" value="2008-4-1" id="id_mydate" />
+<input type="hidden" name="mydate" value="2008-04-01" id="id_mydate" />
 >>> b=GetDate({'mydate':'2008-4-1'})
 >>> print b.is_valid()
 True
Index: tests/regressiontests/forms/forms.py
===================================================================
--- tests/regressiontests/forms/forms.py	(revision 6822)
+++ tests/regressiontests/forms/forms.py	(working copy)
@@ -43,7 +43,7 @@
 >>> print p['last_name']
 <input type="text" name="last_name" value="Lennon" id="id_last_name" />
 >>> print p['birthday']
-<input type="text" name="birthday" value="1940-10-9" id="id_birthday" />
+<input type="text" name="birthday" value="1940-10-09" id="id_birthday" />
 >>> print p['nonexistentfield']
 Traceback (most recent call last):
 ...
@@ -53,16 +53,16 @@
 ...     print boundfield
 <input type="text" name="first_name" value="John" id="id_first_name" />
 <input type="text" name="last_name" value="Lennon" id="id_last_name" />
-<input type="text" name="birthday" value="1940-10-9" id="id_birthday" />
+<input type="text" name="birthday" value="1940-10-09" id="id_birthday" />
 >>> for boundfield in p:
 ...     print boundfield.label, boundfield.data
 First name John
 Last name Lennon
-Birthday 1940-10-9
+Birthday 1940-10-09
 >>> print p
 <tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>
 <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="Lennon" id="id_last_name" /></td></tr>
-<tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>
+<tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-09" id="id_birthday" /></td></tr>
 
 Empty dictionaries are valid, too.
 >>> p = Person({})
@@ -73,9 +73,7 @@
 >>> p.is_valid()
 False
 >>> p.cleaned_data
-Traceback (most recent call last):
-...
-AttributeError: 'Person' object has no attribute 'cleaned_data'
+{}
 >>> print p
 <tr><th><label for="id_first_name">First name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="first_name" id="id_first_name" /></td></tr>
 <tr><th><label for="id_last_name">Last name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="last_name" id="id_last_name" /></td></tr>
@@ -130,11 +128,11 @@
 Unicode values are handled properly.
 >>> p = Person({'first_name': u'John', 'last_name': u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111', 'birthday': '1940-10-9'})
 >>> p.as_table()
-u'<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>\n<tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></td></tr>\n<tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></td></tr>'
+u'<tr><th><label for="id_first_name">First name:</label></th><td><input type="text" name="first_name" value="John" id="id_first_name" /></td></tr>\n<tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></td></tr>\n<tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" value="1940-10-09" id="id_birthday" /></td></tr>'
 >>> p.as_ul()
-u'<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></li>\n<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></li>\n<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></li>'
+u'<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></li>\n<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></li>\n<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-09" id="id_birthday" /></li>'
 >>> p.as_p()
-u'<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></p>\n<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></p>\n<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-9" id="id_birthday" /></p>'
+u'<p><label for="id_first_name">First name:</label> <input type="text" name="first_name" value="John" id="id_first_name" /></p>\n<p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" value="\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111" id="id_last_name" /></p>\n<p><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" value="1940-10-09" id="id_birthday" /></p>'
 
 >>> p = Person({'last_name': u'Lennon'})
 >>> p.errors
@@ -149,9 +147,7 @@
 * birthday
   * This field is required.
 >>> p.cleaned_data
-Traceback (most recent call last):
-...
-AttributeError: 'Person' object has no attribute 'cleaned_data'
+{'last_name': u'Lennon'}
 >>> p['first_name'].errors
 [u'This field is required.']
 >>> p['first_name'].errors.as_ul()
@@ -802,17 +798,17 @@
 <tr><td colspan="2"><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></td></tr>
 <tr><th>First name:</th><td><input type="text" name="first_name" value="John" /></td></tr>
 <tr><th>Last name:</th><td><input type="text" name="last_name" value="Lennon" /></td></tr>
-<tr><th>Birthday:</th><td><input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></td></tr>
+<tr><th>Birthday:</th><td><input type="text" name="birthday" value="1940-10-09" /><input type="hidden" name="hidden_text" /></td></tr>
 >>> print p.as_ul()
 <li><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></li>
 <li>First name: <input type="text" name="first_name" value="John" /></li>
 <li>Last name: <input type="text" name="last_name" value="Lennon" /></li>
-<li>Birthday: <input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></li>
+<li>Birthday: <input type="text" name="birthday" value="1940-10-09" /><input type="hidden" name="hidden_text" /></li>
 >>> print p.as_p()
 <ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul>
 <p>First name: <input type="text" name="first_name" value="John" /></p>
 <p>Last name: <input type="text" name="last_name" value="Lennon" /></p>
-<p>Birthday: <input type="text" name="birthday" value="1940-10-9" /><input type="hidden" name="hidden_text" /></p>
+<p>Birthday: <input type="text" name="birthday" value="1940-10-09" /><input type="hidden" name="hidden_text" /></p>
 
 A corner case: It's possible for a form to have only HiddenInputs.
 >>> class TestForm(Form):
@@ -1247,13 +1243,13 @@
 >>> print p.as_ul()
 <li><label for="id_person1-first_name">First name:</label> <input type="text" name="person1-first_name" value="John" id="id_person1-first_name" /></li>
 <li><label for="id_person1-last_name">Last name:</label> <input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" /></li>
-<li><label for="id_person1-birthday">Birthday:</label> <input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" /></li>
+<li><label for="id_person1-birthday">Birthday:</label> <input type="text" name="person1-birthday" value="1940-10-09" id="id_person1-birthday" /></li>
 >>> print p['first_name']
 <input type="text" name="person1-first_name" value="John" id="id_person1-first_name" />
 >>> print p['last_name']
 <input type="text" name="person1-last_name" value="Lennon" id="id_person1-last_name" />
 >>> print p['birthday']
-<input type="text" name="person1-birthday" value="1940-10-9" id="id_person1-birthday" />
+<input type="text" name="person1-birthday" value="1940-10-09" id="id_person1-birthday" />
 >>> p.errors
 {}
 >>> p.is_valid()
Index: docs/newforms.txt
===================================================================
--- docs/newforms.txt	(revision 6822)
+++ docs/newforms.txt	(working copy)
@@ -247,8 +247,9 @@
 always cleans the input into a Unicode string. We'll cover the encoding
 implications later in this document.
 
-If your data does *not* validate, your ``Form`` instance will not have a
-``cleaned_data`` attribute::
+If your data does *not* validate, your ``Form`` instance will still have a
+``cleaned_data`` attribute, but it will only contain data from fields that
+did validate::
 
     >>> data = {'subject': '',
     ...         'message': 'Hi there',
@@ -258,9 +259,7 @@
     >>> f.is_valid()
     False
     >>> f.cleaned_data
-    Traceback (most recent call last):
-    ...
-    AttributeError: 'ContactForm' object has no attribute 'cleaned_data'
+    {'cc_myself': True, 'message': u'Hi there'}
 
 ``cleaned_data`` will always *only* contain a key for fields defined in the
 ``Form``, even if you pass extra data when you define the ``Form``. In this
