Index: django/newforms/fields.py
===================================================================
--- django/newforms/fields.py	(revision 4295)
+++ django/newforms/fields.py	(working copy)
@@ -33,7 +33,7 @@
     # Tracks each time a Field instance is created. Used to retain order.
     creation_counter = 0
 
-    def __init__(self, required=True, widget=None, label=None, initial=None):
+    def __init__(self, required=True, widget=None, label=None, initial=None, help_text=None):
         # required -- Boolean that specifies whether the field is required.
         #             True by default.
         # widget -- A Widget class, or instance of a Widget class, that should be
@@ -47,7 +47,7 @@
         #            *not* used as a fallback if data isn't given.
         if label is not None:
             label = smart_unicode(label)
-        self.required, self.label, self.initial = required, label, initial
+        self.required, self.label, self.initial, self.help_text = required, label, initial, help_text
         widget = widget or self.widget
         if isinstance(widget, type):
             widget = widget()
@@ -83,9 +83,9 @@
         return {}
 
 class CharField(Field):
-    def __init__(self, max_length=None, min_length=None, required=True, widget=None, label=None, initial=None):
+    def __init__(self, max_length=None, min_length=None, required=True, widget=None, label=None, initial=None, help_text=None):
         self.max_length, self.min_length = max_length, min_length
-        Field.__init__(self, required, widget, label, initial)
+        Field.__init__(self, required, widget, label, initial, help_text)
 
     def clean(self, value):
         "Validates max_length and min_length. Returns a Unicode object."
@@ -106,9 +106,9 @@
             return {'maxlength': str(self.max_length)}
 
 class IntegerField(Field):
-    def __init__(self, max_value=None, min_value=None, required=True, widget=None, label=None, initial=None):
+    def __init__(self, max_value=None, min_value=None, required=True, widget=None, label=None, initial=None, help_text=None):
         self.max_value, self.min_value = max_value, min_value
-        Field.__init__(self, required, widget, label, initial)
+        Field.__init__(self, required, widget, label, initial, help_text)
 
     def clean(self, value):
         """
@@ -137,8 +137,8 @@
 )
 
 class DateField(Field):
-    def __init__(self, input_formats=None, required=True, widget=None, label=None, initial=None):
-        Field.__init__(self, required, widget, label, initial)
+    def __init__(self, input_formats=None, required=True, widget=None, label=None, initial=None, help_text=None):
+        Field.__init__(self, required, widget, label, initial, help_text)
         self.input_formats = input_formats or DEFAULT_DATE_INPUT_FORMATS
 
     def clean(self, value):
@@ -166,8 +166,8 @@
 )
 
 class TimeField(Field):
-    def __init__(self, input_formats=None, required=True, widget=None, label=None, initial=None):
-        Field.__init__(self, required, widget, label, initial)
+    def __init__(self, input_formats=None, required=True, widget=None, label=None, initial=None, help_text=None):
+        Field.__init__(self, required, widget, label, initial, help_text)
         self.input_formats = input_formats or DEFAULT_TIME_INPUT_FORMATS
 
     def clean(self, value):
@@ -200,8 +200,8 @@
 )
 
 class DateTimeField(Field):
-    def __init__(self, input_formats=None, required=True, widget=None, label=None, initial=None):
-        Field.__init__(self, required, widget, label, initial)
+    def __init__(self, input_formats=None, required=True, widget=None, label=None, initial=None, help_text=None):
+        Field.__init__(self, required, widget, label, initial, help_text)
         self.input_formats = input_formats or DEFAULT_DATETIME_INPUT_FORMATS
 
     def clean(self, value):
@@ -225,7 +225,7 @@
 
 class RegexField(Field):
     def __init__(self, regex, max_length=None, min_length=None, error_message=None,
-            required=True, widget=None, label=None, initial=None):
+            required=True, widget=None, label=None, initial=None, help_text=None):
         """
         regex can be either a string or a compiled regular expression object.
         error_message is an optional error message to use, if
@@ -262,8 +262,8 @@
     r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE)  # domain
 
 class EmailField(RegexField):
-    def __init__(self, max_length=None, min_length=None, required=True, widget=None, label=None, initial=None):
-        RegexField.__init__(self, email_re, max_length, min_length, gettext(u'Enter a valid e-mail address.'), required, widget, label, initial)
+    def __init__(self, max_length=None, min_length=None, required=True, widget=None, label=None, initial=None, help_text=None):
+        RegexField.__init__(self, email_re, max_length, min_length, gettext(u'Enter a valid e-mail address.'), required, widget, label, initial, help_text)
 
 url_re = re.compile(
     r'^https?://' # http:// or https://
@@ -280,8 +280,8 @@
 
 class URLField(RegexField):
     def __init__(self, max_length=None, min_length=None, required=True, verify_exists=False, widget=None, label=None,
-            initial=None, validator_user_agent=URL_VALIDATOR_USER_AGENT):
-        RegexField.__init__(self, url_re, max_length, min_length, gettext(u'Enter a valid URL.'), required, widget, label, initial)
+            initial=None, validator_user_agent=URL_VALIDATOR_USER_AGENT, help_text=None):
+        RegexField.__init__(self, url_re, max_length, min_length, gettext(u'Enter a valid URL.'), required, widget, label, initial, help_text)
         self.verify_exists = verify_exists
         self.user_agent = validator_user_agent
 
@@ -315,10 +315,10 @@
         return bool(value)
 
 class ChoiceField(Field):
-    def __init__(self, choices=(), required=True, widget=Select, label=None, initial=None):
+    def __init__(self, choices=(), required=True, widget=Select, label=None, initial=None, help_text=None):
         if isinstance(widget, type):
             widget = widget(choices=choices)
-        Field.__init__(self, required, widget, label, initial)
+        Field.__init__(self, required, widget, label, initial, help_text)
         self.choices = choices
 
     def clean(self, value):
@@ -336,8 +336,8 @@
         return value
 
 class MultipleChoiceField(ChoiceField):
-    def __init__(self, choices=(), required=True, widget=SelectMultiple, label=None, initial=None):
-        ChoiceField.__init__(self, choices, required, widget, label, initial)
+    def __init__(self, choices=(), required=True, widget=SelectMultiple, label=None, initial=None, help_text=None):
+        ChoiceField.__init__(self, choices, required, widget, label, initial, help_text)
 
     def clean(self, value):
         """
@@ -361,8 +361,8 @@
         return new_value
 
 class ComboField(Field):
-    def __init__(self, fields=(), required=True, widget=None, label=None, initial=None):
-        Field.__init__(self, required, widget, label, initial)
+    def __init__(self, fields=(), required=True, widget=None, label=None, initial=None, help_text=None):
+        Field.__init__(self, required, widget, label, initial, help_text)
         # Set 'required' to False on the individual fields, because the
         # required validation will be handled by ComboField, not by those
         # individual fields.
Index: django/newforms/forms.py
===================================================================
--- django/newforms/forms.py	(revision 4295)
+++ django/newforms/forms.py	(working copy)
@@ -84,13 +84,14 @@
         """
         return self.prefix and ('%s-%s' % (self.prefix, field_name)) or field_name
 
-    def _html_output(self, normal_row, error_row, row_ender, errors_on_separate_row):
+    def _html_output(self, normal_row, error_row, help_row, row_ender, errors_on_separate_row, help_on_separate_row):
         "Helper function for outputting HTML. Used by as_table(), as_ul(), as_p()."
         top_errors = self.non_field_errors() # Errors that should be displayed above all fields.
         output, hidden_fields = [], []
         for name, field in self.fields.items():
             bf = BoundField(self, field, name)
             bf_errors = bf.errors # Cache in local variable.
+            bf_help_text = bf.field.help_text or ''
             if bf.is_hidden:
                 if bf_errors:
                     top_errors.extend(['(Hidden field %s) %s' % (name, e) for e in bf_errors])
@@ -99,7 +100,9 @@
                 if errors_on_separate_row and bf_errors:
                     output.append(error_row % bf_errors)
                 label = bf.label and bf.label_tag(escape(bf.label + ':')) or ''
-                output.append(normal_row % {'errors': bf_errors, 'label': label, 'field': bf})
+                output.append(normal_row % {'errors': bf_errors, 'label': label, 'field': bf, 'help_text': bf_help_text})
+                if help_on_separate_row and bf_help_text:
+                    output.append(help_row % bf_help_text)
         if top_errors:
             output.insert(0, error_row % top_errors)
         if hidden_fields: # Insert any hidden fields in the last row.
@@ -114,15 +117,16 @@
 
     def as_table(self):
         "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
-        return self._html_output(u'<tr><th>%(label)s</th><td>%(errors)s%(field)s</td></tr>', u'<tr><td colspan="2">%s</td></tr>', '</td></tr>', False)
+        return self._html_output(u'<tr><th>%(label)s</th><td>%(errors)s%(field)s</td></tr>', u'<tr><td colspan="2">%s</td></tr>',
+            u'<tr><td colspan="2">%s</td></tr>', '</td></tr>', False, True)
 
     def as_ul(self):
         "Returns this form rendered as HTML <li>s -- excluding the <ul></ul>."
-        return self._html_output(u'<li>%(errors)s%(label)s %(field)s</li>', u'<li>%s</li>', '</li>', False)
+        return self._html_output(u'<li>%(errors)s%(label)s %(field)s %(help_text)s</li>', u'<li>%s</li>', u'<li>%s</li>', '</li>', False, False)
 
     def as_p(self):
         "Returns this form rendered as HTML <p>s."
-        return self._html_output(u'<p>%(label)s %(field)s</p>', u'<p>%s</p>', '</p>', True)
+        return self._html_output(u'<p>%(label)s %(field)s</p>', u'<p>%s</p>', u'<p>%s</p>', '</p>', True, True)
 
     def non_field_errors(self):
         """
Index: tests/modeltests/model_forms/models.py
===================================================================
--- tests/modeltests/model_forms/models.py	(revision 4295)
+++ tests/modeltests/model_forms/models.py	(working copy)
@@ -56,15 +56,15 @@
 <tr><th><label for="id_name">Name:</label></th><td><input id="id_name" type="text" name="name" maxlength="20" /></td></tr>
 <tr><th><label for="id_url">The URL:</label></th><td><input id="id_url" type="text" name="url" maxlength="40" /></td></tr>
 >>> print f.as_ul()
-<li><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" maxlength="20" /></li>
-<li><label for="id_url">The URL:</label> <input id="id_url" type="text" name="url" maxlength="40" /></li>
+<li><label for="id_name">Name:</label> <input id="id_name" type="text" name="name" maxlength="20" /> </li>
+<li><label for="id_url">The URL:</label> <input id="id_url" type="text" name="url" maxlength="40" /> </li>
 >>> print f['name']
 <input id="id_name" type="text" name="name" maxlength="20" />
 
 >>> f = CategoryForm(auto_id=False)
 >>> print f.as_ul()
-<li>Name: <input type="text" name="name" maxlength="20" /></li>
-<li>The URL: <input type="text" name="url" maxlength="40" /></li>
+<li>Name: <input type="text" name="name" maxlength="20" /> </li>
+<li>The URL: <input type="text" name="url" maxlength="40" /> </li>
 
 >>> f = CategoryForm({'name': 'Entertainment', 'url': 'entertainment'})
 >>> f.is_valid()
@@ -173,18 +173,18 @@
 >>> TestArticleForm = form_for_instance(art)
 >>> f = TestArticleForm(auto_id=False)
 >>> print f.as_ul()
-<li>Headline: <input type="text" name="headline" value="Test article" maxlength="50" /></li>
-<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li>
+<li>Headline: <input type="text" name="headline" value="Test article" maxlength="50" /> </li>
+<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /> </li>
 <li>Writer: <select name="writer">
 <option value="">---------</option>
 <option value="1" selected="selected">Mike Royko</option>
 <option value="2">Bob Woodward</option>
-</select></li>
+</select> </li>
 <li>Categories: <select multiple="multiple" name="categories">
 <option value="1">Entertainment</option>
 <option value="2">It&#39;s a test</option>
 <option value="3">Third test</option>
-</select></li>
+</select> </li>
 >>> f = TestArticleForm({'headline': u'New headline', 'pub_date': u'1988-01-04', 'writer': u'1'})
 >>> f.is_valid()
 True
@@ -204,17 +204,17 @@
 >>> TestArticleForm = form_for_instance(new_art)
 >>> f = TestArticleForm(auto_id=False)
 >>> print f.as_ul()
-<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /></li>
-<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /></li>
+<li>Headline: <input type="text" name="headline" value="New headline" maxlength="50" /> </li>
+<li>Pub date: <input type="text" name="pub_date" value="1988-01-04" /> </li>
 <li>Writer: <select name="writer">
 <option value="">---------</option>
 <option value="1" selected="selected">Mike Royko</option>
 <option value="2">Bob Woodward</option>
-</select></li>
+</select> </li>
 <li>Categories: <select multiple="multiple" name="categories">
 <option value="1" selected="selected">Entertainment</option>
 <option value="2">It&#39;s a test</option>
 <option value="3">Third test</option>
-</select></li>
+</select> </li>
 
 """}
Index: tests/regressiontests/forms/tests.py
===================================================================
--- tests/regressiontests/forms/tests.py	(revision 4295)
+++ tests/regressiontests/forms/tests.py	(working copy)
@@ -1561,9 +1561,9 @@
 <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>
 <tr><th><label for="id_birthday">Birthday:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input type="text" name="birthday" id="id_birthday" /></td></tr>
 >>> print p.as_ul()
-<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li>
-<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li>
-<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /> </li>
+<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /> </li>
+<li><ul class="errorlist"><li>This field is required.</li></ul><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /> </li>
 >>> print p.as_p()
 <p><ul class="errorlist"><li>This field is required.</li></ul></p>
 <p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p>
@@ -1595,9 +1595,9 @@
 <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr>
 <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" id="id_birthday" /></td></tr>
 >>> print p.as_ul()
-<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li>
-<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li>
-<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /></li>
+<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /> </li>
+<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /> </li>
+<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /> </li>
 >>> print p.as_p()
 <p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p>
 <p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p>
@@ -1608,7 +1608,7 @@
 >>> 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>'
 >>> 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-9" 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>'
 
@@ -1653,9 +1653,9 @@
 <tr><th><label for="last_name_id">Last name:</label></th><td><input type="text" name="last_name" id="last_name_id" /></td></tr>
 <tr><th><label for="birthday_id">Birthday:</label></th><td><input type="text" name="birthday" id="birthday_id" /></td></tr>
 >>> print p.as_ul()
-<li><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></li>
-<li><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /></li>
-<li><label for="birthday_id">Birthday:</label> <input type="text" name="birthday" id="birthday_id" /></li>
+<li><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /> </li>
+<li><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /> </li>
+<li><label for="birthday_id">Birthday:</label> <input type="text" name="birthday" id="birthday_id" /> </li>
 >>> print p.as_p()
 <p><label for="first_name_id">First name:</label> <input type="text" name="first_name" id="first_name_id" /></p>
 <p><label for="last_name_id">Last name:</label> <input type="text" name="last_name" id="last_name_id" /></p>
@@ -1665,17 +1665,17 @@
 attribute will be the name of the field.
 >>> p = Person(auto_id=True)
 >>> print p.as_ul()
-<li><label for="first_name">First name:</label> <input type="text" name="first_name" id="first_name" /></li>
-<li><label for="last_name">Last name:</label> <input type="text" name="last_name" id="last_name" /></li>
-<li><label for="birthday">Birthday:</label> <input type="text" name="birthday" id="birthday" /></li>
+<li><label for="first_name">First name:</label> <input type="text" name="first_name" id="first_name" /> </li>
+<li><label for="last_name">Last name:</label> <input type="text" name="last_name" id="last_name" /> </li>
+<li><label for="birthday">Birthday:</label> <input type="text" name="birthday" id="birthday" /> </li>
 
 If auto_id is any False value, an "id" attribute won't be output unless it
 was manually entered.
 >>> p = Person(auto_id=False)
 >>> print p.as_ul()
-<li>First name: <input type="text" name="first_name" /></li>
-<li>Last name: <input type="text" name="last_name" /></li>
-<li>Birthday: <input type="text" name="birthday" /></li>
+<li>First name: <input type="text" name="first_name" /> </li>
+<li>Last name: <input type="text" name="last_name" /> </li>
+<li>Birthday: <input type="text" name="birthday" /> </li>
 
 In this example, auto_id is False, but the "id" attribute for the "first_name"
 field is given. Also note that field gets a <label>, while the others don't.
@@ -1685,17 +1685,17 @@
 ...     birthday = DateField()
 >>> p = PersonNew(auto_id=False)
 >>> print p.as_ul()
-<li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /></li>
-<li>Last name: <input type="text" name="last_name" /></li>
-<li>Birthday: <input type="text" name="birthday" /></li>
+<li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /> </li>
+<li>Last name: <input type="text" name="last_name" /> </li>
+<li>Birthday: <input type="text" name="birthday" /> </li>
 
 If the "id" attribute is specified in the Form and auto_id is True, the "id"
 attribute in the Form gets precedence.
 >>> p = PersonNew(auto_id=True)
 >>> print p.as_ul()
-<li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /></li>
-<li><label for="last_name">Last name:</label> <input type="text" name="last_name" id="last_name" /></li>
-<li><label for="birthday">Birthday:</label> <input type="text" name="birthday" id="birthday" /></li>
+<li><label for="first_name_id">First name:</label> <input type="text" id="first_name_id" name="first_name" /> </li>
+<li><label for="last_name">Last name:</label> <input type="text" name="last_name" id="last_name" /> </li>
+<li><label for="birthday">Birthday:</label> <input type="text" name="birthday" id="birthday" /> </li>
 
 >>> class SignupForm(Form):
 ...     email = EmailField()
@@ -1785,11 +1785,11 @@
 <li><label><input type="radio" name="language" value="J" /> Java</label></li>
 </ul></td></tr>
 >>> print f.as_ul()
-<li>Name: <input type="text" name="name" /></li>
+<li>Name: <input type="text" name="name" /> </li>
 <li>Language: <ul>
 <li><label><input type="radio" name="language" value="P" /> Python</label></li>
 <li><label><input type="radio" name="language" value="J" /> Java</label></li>
-</ul></li>
+</ul> </li>
 
 Regarding auto_id and <label>, RadioSelect is a special case. Each radio button
 gets a distinct ID, formed by appending an underscore plus the button's
@@ -1811,11 +1811,11 @@
 <li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
 </ul></td></tr>
 >>> print f.as_ul()
-<li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></li>
+<li><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /> </li>
 <li><label for="id_language_0">Language:</label> <ul>
 <li><label><input type="radio" id="id_language_0" value="P" name="language" /> Python</label></li>
 <li><label><input type="radio" id="id_language_1" value="J" name="language" /> Java</label></li>
-</ul></li>
+</ul> </li>
 >>> print f.as_p()
 <p><label for="id_name">Name:</label> <input type="text" name="name" id="id_name" /></p>
 <p><label for="id_language_0">Language:</label> <ul>
@@ -1970,9 +1970,9 @@
 <tr><th>Password2:</th><td><input type="password" name="password2" value="bar" /></td></tr>
 >>> print f.as_ul()
 <li><ul class="errorlist"><li>Please make sure your passwords match.</li></ul></li>
-<li>Username: <input type="text" name="username" value="adrian" maxlength="10" /></li>
-<li>Password1: <input type="password" name="password1" value="foo" /></li>
-<li>Password2: <input type="password" name="password2" value="bar" /></li>
+<li>Username: <input type="text" name="username" value="adrian" maxlength="10" /> </li>
+<li>Password1: <input type="password" name="password1" value="foo" /> </li>
+<li>Password2: <input type="password" name="password2" value="bar" /> </li>
 >>> f = UserRegistration({'username': 'adrian', 'password1': 'foo', 'password2': 'foo'}, auto_id=False)
 >>> f.errors
 {}
@@ -2009,9 +2009,9 @@
 <tr><th>Last name:</th><td><input type="text" name="last_name" /></td></tr>
 <tr><th>Birthday:</th><td><input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></td></tr>
 >>> print p.as_ul()
-<li>First name: <input type="text" name="first_name" /></li>
-<li>Last name: <input type="text" name="last_name" /></li>
-<li>Birthday: <input type="text" name="birthday" /><input type="hidden" name="hidden_text" /></li>
+<li>First name: <input type="text" name="first_name" /> </li>
+<li>Last name: <input type="text" name="last_name" /> </li>
+<li>Birthday: <input type="text" name="birthday" /> <input type="hidden" name="hidden_text" /></li>
 >>> print p.as_p()
 <p>First name: <input type="text" name="first_name" /></p>
 <p>Last name: <input type="text" name="last_name" /></p>
@@ -2024,9 +2024,9 @@
 <tr><th><label for="id_last_name">Last name:</label></th><td><input type="text" name="last_name" id="id_last_name" /></td></tr>
 <tr><th><label for="id_birthday">Birthday:</label></th><td><input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></td></tr>
 >>> print p.as_ul()
-<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></li>
-<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></li>
-<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /><input type="hidden" name="hidden_text" id="id_hidden_text" /></li>
+<li><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /> </li>
+<li><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /> </li>
+<li><label for="id_birthday">Birthday:</label> <input type="text" name="birthday" id="id_birthday" /> <input type="hidden" name="hidden_text" id="id_hidden_text" /></li>
 >>> print p.as_p()
 <p><label for="id_first_name">First name:</label> <input type="text" name="first_name" id="id_first_name" /></p>
 <p><label for="id_last_name">Last name:</label> <input type="text" name="last_name" id="id_last_name" /></p>
@@ -2044,9 +2044,9 @@
 <tr><th>Birthday:</th><td><input type="text" name="birthday" value="1940-10-9" /><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>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>
 >>> print p.as_p()
 <p><ul class="errorlist"><li>(Hidden field hidden_text) This field is required.</li></ul></p>
 <p>First name: <input type="text" name="first_name" value="John" /></p>
@@ -2109,10 +2109,10 @@
 ...    address = CharField()                                 # no max_length defined here
 >>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
-<li>Username: <input type="text" name="username" maxlength="10" /></li>
-<li>Password: <input type="password" name="password" maxlength="10" /></li>
-<li>Realname: <input type="text" name="realname" maxlength="10" /></li>
-<li>Address: <input type="text" name="address" /></li>
+<li>Username: <input type="text" name="username" maxlength="10" /> </li>
+<li>Password: <input type="password" name="password" maxlength="10" /> </li>
+<li>Realname: <input type="text" name="realname" maxlength="10" /> </li>
+<li>Address: <input type="text" name="address" /> </li>
 
 If you specify a custom "attrs" that includes the "maxlength" attribute,
 the Field's max_length attribute will override whatever "maxlength" you specify
@@ -2122,8 +2122,8 @@
 ...    password = CharField(max_length=10, widget=PasswordInput)
 >>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
-<li>Username: <input type="text" name="username" maxlength="10" /></li>
-<li>Password: <input type="password" name="password" maxlength="10" /></li>
+<li>Username: <input type="text" name="username" maxlength="10" /> </li>
+<li>Password: <input type="password" name="password" maxlength="10" /> </li>
 
 # Specifying labels ###########################################################
 
@@ -2136,9 +2136,9 @@
 ...    password2 = CharField(widget=PasswordInput, label='Password (again)')
 >>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
-<li>Your username: <input type="text" name="username" maxlength="10" /></li>
-<li>Password1: <input type="password" name="password1" /></li>
-<li>Password (again): <input type="password" name="password2" /></li>
+<li>Your username: <input type="text" name="username" maxlength="10" /> </li>
+<li>Password1: <input type="password" name="password1" /> </li>
+<li>Password (again): <input type="password" name="password2" /> </li>
 
 A label can be a Unicode object or a bytestring with special characters.
 >>> class UserRegistration(Form):
@@ -2146,7 +2146,7 @@
 ...    password = CharField(widget=PasswordInput, label=u'\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111')
 >>> p = UserRegistration(auto_id=False)
 >>> p.as_ul()
-u'<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="text" name="username" maxlength="10" /></li>\n<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="password" name="password" /></li>'
+u'<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="text" name="username" maxlength="10" /> </li>\n<li>\u0160\u0110\u0106\u017d\u0107\u017e\u0161\u0111: <input type="password" name="password" /> </li>'
 
 If a label is set to the empty string for a field, that field won't get a label.
 >>> class UserRegistration(Form):
@@ -2154,12 +2154,12 @@
 ...    password = CharField(widget=PasswordInput)
 >>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
-<li> <input type="text" name="username" maxlength="10" /></li>
-<li>Password: <input type="password" name="password" /></li>
+<li> <input type="text" name="username" maxlength="10" /> </li>
+<li>Password: <input type="password" name="password" /> </li>
 >>> p = UserRegistration(auto_id='id_%s')
 >>> print p.as_ul()
-<li> <input id="id_username" type="text" name="username" maxlength="10" /></li>
-<li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></li>
+<li> <input id="id_username" type="text" name="username" maxlength="10" /> </li>
+<li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /> </li>
 
 If label is None, Django will auto-create the label from the field name. This
 is default behavior.
@@ -2168,12 +2168,12 @@
 ...    password = CharField(widget=PasswordInput)
 >>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
-<li>Username: <input type="text" name="username" maxlength="10" /></li>
-<li>Password: <input type="password" name="password" /></li>
+<li>Username: <input type="text" name="username" maxlength="10" /> </li>
+<li>Password: <input type="password" name="password" /> </li>
 >>> p = UserRegistration(auto_id='id_%s')
 >>> print p.as_ul()
-<li><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /></li>
-<li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></li>
+<li><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="10" /> </li>
+<li><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /> </li>
 
 # Initial data ################################################################
 
@@ -2189,22 +2189,22 @@
 Here, we're not submitting any data, so the initial value will be displayed.
 >>> p = UserRegistration(auto_id=False)
 >>> print p.as_ul()
-<li>Username: <input type="text" name="username" value="django" maxlength="10" /></li>
-<li>Password: <input type="password" name="password" /></li>
+<li>Username: <input type="text" name="username" value="django" maxlength="10" /> </li>
+<li>Password: <input type="password" name="password" /> </li>
 
 Here, we're submitting data, so the initial value will *not* be displayed.
 >>> p = UserRegistration({}, auto_id=False)
 >>> print p.as_ul()
-<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li>
-<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /> </li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /> </li>
 >>> p = UserRegistration({'username': u''}, auto_id=False)
 >>> print p.as_ul()
-<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /></li>
-<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Username: <input type="text" name="username" maxlength="10" /> </li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /> </li>
 >>> p = UserRegistration({'username': u'foo'}, auto_id=False)
 >>> print p.as_ul()
-<li>Username: <input type="text" name="username" value="foo" maxlength="10" /></li>
-<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /></li>
+<li>Username: <input type="text" name="username" value="foo" maxlength="10" /> </li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /> </li>
 
 An 'initial' value is *not* used as a fallback if data is not provided. In this
 example, we don't provide a value for 'username', and the form raises a
@@ -2215,6 +2215,44 @@
 >>> p.is_valid()
 False
 
+# Help text ###################################################################
+
+You can specify descriptive text for a field by using the 'help_text' argument
+to a Field class. This help text is displayed when a Form is rendered.
+>>> class UserRegistration(Form):
+...    username = CharField(max_length=10, help_text='Ex. user@example.com')
+...    password = CharField(widget=PasswordInput)
+
+Help text is presented verbatim in all as_*() methods.
+>>> p = UserRegistration(auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" maxlength="10" /> Ex. user@example.com</li>
+<li>Password: <input type="password" name="password" /> </li>
+>>> print p.as_p()
+<p>Username: <input type="text" name="username" maxlength="10" /></p>
+<p>Ex. user@example.com</p>
+<p>Password: <input type="password" name="password" /></p>
+>>> print p.as_table()
+<tr><th>Username:</th><td><input type="text" name="username" maxlength="10" /></td></tr>
+<tr><td colspan="2">Ex. user@example.com</td></tr>
+<tr><th>Password:</th><td><input type="password" name="password" /></td></tr>
+
+The help text is displayed wheter or not data is provided for the form.
+>>> p = UserRegistration({'username': u'foo'}, auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" value="foo" maxlength="10" /> Ex. user@example.com</li>
+<li><ul class="errorlist"><li>This field is required.</li></ul>Password: <input type="password" name="password" /> </li>
+
+For hidden fields, help_text is not displayed.  It can be used for documentation purposes though.
+>>> class UserRegistration(Form):
+...    username = CharField(max_length=10, help_text='Ex. user@example.com')
+...    password = CharField(widget=PasswordInput)
+...    next = CharField(widget=HiddenInput, initial='/', help_text='Redirect to destination')
+>>> p = UserRegistration(auto_id=False)
+>>> print p.as_ul()
+<li>Username: <input type="text" name="username" maxlength="10" /> Ex. user@example.com</li>
+<li>Password: <input type="password" name="password" /> <input type="hidden" name="next" value="/" /></li>
+
 # Forms with prefixes #########################################################
 
 Sometimes it's necessary to have multiple forms display on the same HTML page,
@@ -2235,9 +2273,9 @@
 ... }
 >>> p = Person(data, prefix='person1')
 >>> 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-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>
 >>> print p['first_name']
 <input type="text" name="person1-first_name" value="John" id="id_person1-first_name" />
 >>> print p['last_name']
@@ -2312,9 +2350,9 @@
 ...         return self.prefix and '%s-prefix-%s' % (self.prefix, field_name) or field_name
 >>> p = Person(prefix='foo')
 >>> print p.as_ul()
-<li><label for="id_foo-prefix-first_name">First name:</label> <input type="text" name="foo-prefix-first_name" id="id_foo-prefix-first_name" /></li>
-<li><label for="id_foo-prefix-last_name">Last name:</label> <input type="text" name="foo-prefix-last_name" id="id_foo-prefix-last_name" /></li>
-<li><label for="id_foo-prefix-birthday">Birthday:</label> <input type="text" name="foo-prefix-birthday" id="id_foo-prefix-birthday" /></li>
+<li><label for="id_foo-prefix-first_name">First name:</label> <input type="text" name="foo-prefix-first_name" id="id_foo-prefix-first_name" /> </li>
+<li><label for="id_foo-prefix-last_name">Last name:</label> <input type="text" name="foo-prefix-last_name" id="id_foo-prefix-last_name" /> </li>
+<li><label for="id_foo-prefix-birthday">Birthday:</label> <input type="text" name="foo-prefix-birthday" id="id_foo-prefix-birthday" /> </li>
 >>> data = {
 ...     'foo-prefix-first_name': u'John',
 ...     'foo-prefix-last_name': u'Lennon',
