diff --git a/docs/ref/forms/api.txt b/docs/ref/forms/api.txt
index ca9e4d868f..a8d2fa77ff 100644
--- a/docs/ref/forms/api.txt
+++ b/docs/ref/forms/api.txt
@@ -767,6 +767,8 @@ method you're using::
     <p>Sender: <input type="email" name="sender" value="invalid email address" /></p>
     <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p>
 
+.. _ref-forms-error-list-format:
+
 Customizing the error list format
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -792,10 +794,10 @@ Python 2)::
     <p>Cc myself: <input checked="checked" type="checkbox" name="cc_myself" /></p>
 
 More granular output
-~~~~~~~~~~~~~~~~~~~~
+--------------------
 
-The ``as_p()``, ``as_ul()`` and ``as_table()`` methods are simply shortcuts for
-lazy developers -- they're not the only way a form object can be displayed.
+The ``as_p()``, ``as_ul()``, and ``as_table()`` methods are simply shortcuts --
+they're not the only way a form object can be displayed.
 
 .. class:: BoundField
 
@@ -830,107 +832,180 @@ The field-specific output honors the form object's ``auto_id`` setting::
     >>> print(f['message'])
     <input type="text" name="message" id="id_message" />
 
-For a field's list of errors, access the field's ``errors`` attribute.
+Attributes of ``BoundField``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. attribute:: BoundField.data
+
+    This property returns the data for this :class:`~django.forms.BoundField`
+    extracted by the widget's :meth:`~django.forms.Widget.value_from_datadict`
+    method, or ``None`` if it wasn't given::
+
+        >>> unbound_form = ContactForm()
+        >>> print(unbound_form['subject'].data)
+        None
+        >>> bound_form = ContactForm(data={'subject': 'My Subject'})
+        >>> print(bound_form['subject'].data)
+        My Subject
 
 .. attribute:: BoundField.errors
 
-A list-like object that is displayed as an HTML ``<ul class="errorlist">``
-when printed::
+    A :ref:`list-like object <ref-forms-error-list-format>` that is displayed
+    as an HTML ``<ul class="errorlist">`` when printed::
 
-    >>> data = {'subject': 'hi', 'message': '', 'sender': '', 'cc_myself': ''}
-    >>> f = ContactForm(data, auto_id=False)
-    >>> print(f['message'])
-    <input type="text" name="message" />
-    >>> f['message'].errors
-    ['This field is required.']
-    >>> print(f['message'].errors)
-    <ul class="errorlist"><li>This field is required.</li></ul>
-    >>> f['subject'].errors
-    []
-    >>> print(f['subject'].errors)
+        >>> data = {'subject': 'hi', 'message': '', 'sender': '', 'cc_myself': ''}
+        >>> f = ContactForm(data, auto_id=False)
+        >>> print(f['message'])
+        <input type="text" name="message" />
+        >>> f['message'].errors
+        ['This field is required.']
+        >>> print(f['message'].errors)
+        <ul class="errorlist"><li>This field is required.</li></ul>
+        >>> f['subject'].errors
+        []
+        >>> print(f['subject'].errors)
 
-    >>> str(f['subject'].errors)
-    ''
+        >>> str(f['subject'].errors)
+        ''
 
-.. method:: BoundField.label_tag(contents=None, attrs=None, label_suffix=None)
+.. attribute:: BoundField.field
 
-To separately render the label tag of a form field, you can call its
-``label_tag`` method::
+    The form :class:`~django.forms.Field` instance from the form class that
+    this :class:`~django.forms.BoundField` wraps.
 
-    >>> f = ContactForm(data)
-    >>> print(f['message'].label_tag())
-    <label for="id_message">Message:</label>
+.. attribute:: BoundField.form
 
-Optionally, you can provide the ``contents`` parameter which will replace the
-auto-generated label tag. An optional ``attrs`` dictionary may contain
-additional attributes for the ``<label>`` tag.
+    The :class:`~django.forms.Form` instance this :class:`~django.forms.BoundField`
+    is bound to.
 
-The HTML that's generated includes the form's
-:attr:`~django.forms.Form.label_suffix` (a colon, by default) or, if set, the
-current field's :attr:`~django.forms.Field.label_suffix`. The optional
-``label_suffix`` parameter allows you to override any previously set
-suffix. For example, you can use an empty string to hide the label on selected
-fields. If you need to do this in a template, you could write a custom
-filter to allow passing parameters to ``label_tag``.
+.. attribute:: BoundField.help_text
 
-.. versionchanged:: 1.8
+    The :attr:`~django.forms.Field.help_text` of the field.
 
-    The label includes :attr:`~Form.required_css_class` if applicable.
+.. attribute:: BoundField.html_name
 
-.. method:: BoundField.css_classes()
-
-When you use Django's rendering shortcuts, CSS classes are used to
-indicate required form fields or fields that contain errors. If you're
-manually rendering a form, you can access these CSS classes using the
-``css_classes`` method::
-
-    >>> f = ContactForm(data)
-    >>> f['message'].css_classes()
-    'required'
-
-If you want to provide some additional classes in addition to the
-error and required classes that may be required, you can provide
-those classes as an argument::
-
-    >>> f = ContactForm(data)
-    >>> f['message'].css_classes('foo bar')
-    'foo bar required'
-
-.. method:: BoundField.value()
-
-Use this method to render the raw value of this field as it would be rendered
-by a ``Widget``::
-
-    >>> initial = {'subject': 'welcome'}
-    >>> unbound_form = ContactForm(initial=initial)
-    >>> bound_form = ContactForm(data, initial=initial)
-    >>> print(unbound_form['subject'].value())
-    welcome
-    >>> print(bound_form['subject'].value())
-    hi
+    The name that will be used in the widget's HTML ``name`` attribute. It takes
+    the form :attr:`~django.forms.Form.prefix` into account.
 
 .. attribute:: BoundField.id_for_label
 
-Use this property to render the ID of this field. For example, if you are
-manually constructing a ``<label>`` in your template (despite the fact that
-:meth:`~BoundField.label_tag` will do this for you):
+    Use this property to render the ID of this field. For example, if you are
+    manually constructing a ``<label>`` in your template (despite the fact that
+    :meth:`~BoundField.label_tag` will do this for you):
 
-.. code-block:: html+django
+    .. code-block:: html+django
 
-    <label for="{{ form.my_field.id_for_label }}">...</label>{{ my_field }}
+        <label for="{{ form.my_field.id_for_label }}">...</label>{{ my_field }}
 
-By default, this will be the field's name prefixed by ``id_``
-("``id_my_field``" for the example above). You may modify the ID by setting
-:attr:`~django.forms.Widget.attrs` on the field's widget. For example,
-declaring a field like this::
+    By default, this will be the field's name prefixed by ``id_``
+    ("``id_my_field``" for the example above). You may modify the ID by setting
+    :attr:`~django.forms.Widget.attrs` on the field's widget. For example,
+    declaring a field like this::
 
-    my_field = forms.CharField(widget=forms.TextInput(attrs={'id': 'myFIELD'}))
+        my_field = forms.CharField(widget=forms.TextInput(attrs={'id': 'myFIELD'}))
 
-and using the template above, would render something like:
+    and using the template above, would render something like:
 
-.. code-block:: html
+    .. code-block:: html
 
-    <label for="myFIELD">...</label><input id="myFIELD" type="text" name="my_field" />
+        <label for="myFIELD">...</label><input id="myFIELD" type="text" name="my_field" />
+
+.. attribute:: BoundField.is_hidden
+
+    Returns ``True`` if this :class:`~django.forms.BoundField`'s widget is
+    hidden.
+
+.. attribute:: BoundField.label
+
+    The :attr:`~django.forms.Field.label` of the field. This is used in
+    :meth:`~BoundField.label_tag`.
+
+.. attribute:: BoundField.name
+
+    The name of this field in the form::
+
+        >>> f = ContactForm()
+        >>> print(f['subject'].name)
+        subject
+        >>> print(f['message'].name)
+        message
+
+Methods of ``BoundField``
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. method:: BoundField.as_hidden(attrs=None, **kwargs)
+
+    Returns a string of HTML for representing this as an ``<input type="hidden">``.
+
+    ``**kwargs`` are passed to :meth:`~django.forms.BoundField.as_widget`.
+
+    This method is primarily used internally. You should use a widget instead.
+
+.. method:: BoundField.as_widget(widget=None, attrs=None, only_initial=False)
+
+    Renders the field by rendering the passed widget, adding any HTML
+    attributes passed as ``attrs``.  If no widget is specified, then the
+    field's default widget will be used.
+
+    ``only_initial`` is used by Django internals and should not be set
+    explicitly.
+
+.. method:: BoundField.css_classes()
+
+    When you use Django's rendering shortcuts, CSS classes are used to
+    indicate required form fields or fields that contain errors. If you're
+    manually rendering a form, you can access these CSS classes using the
+    ``css_classes`` method::
+
+        >>> f = ContactForm(data={'message': ''})
+        >>> f['message'].css_classes()
+        'required'
+
+    If you want to provide some additional classes in addition to the
+    error and required classes that may be required, you can provide
+    those classes as an argument::
+
+        >>> f = ContactForm(data={'message': ''})
+        >>> f['message'].css_classes('foo bar')
+        'foo bar required'
+
+.. method:: BoundField.label_tag(contents=None, attrs=None, label_suffix=None)
+
+    To separately render the label tag of a form field, you can call its
+    ``label_tag()`` method::
+
+        >>> f = ContactForm(data={'message': ''})
+        >>> print(f['message'].label_tag())
+        <label for="id_message">Message:</label>
+
+    You can provide the ``contents`` parameter which will replace the
+    auto-generated label tag. An ``attrs`` dictionary may contain additional
+    attributes for the ``<label>`` tag.
+
+    The HTML that's generated includes the form's
+    :attr:`~django.forms.Form.label_suffix` (a colon, by default) or, if set, the
+    current field's :attr:`~django.forms.Field.label_suffix`. The optional
+    ``label_suffix`` parameter allows you to override any previously set
+    suffix. For example, you can use an empty string to hide the label on selected
+    fields. If you need to do this in a template, you could write a custom
+    filter to allow passing parameters to ``label_tag``.
+
+    .. versionchanged:: 1.8
+
+        The label includes :attr:`~Form.required_css_class` if applicable.
+
+.. method:: BoundField.value()
+
+    Use this method to render the raw value of this field as it would be rendered
+    by a ``Widget``::
+
+        >>> initial = {'subject': 'welcome'}
+        >>> unbound_form = ContactForm(initial=initial)
+        >>> bound_form = ContactForm(data={'subject': 'hi'}, initial=initial)
+        >>> print(unbound_form['subject'].value())
+        welcome
+        >>> print(bound_form['subject'].value())
+        hi
 
 Customizing ``BoundField``
 --------------------------
diff --git a/docs/ref/forms/widgets.txt b/docs/ref/forms/widgets.txt
index ab7679bf34..5e51ec10b1 100644
--- a/docs/ref/forms/widgets.txt
+++ b/docs/ref/forms/widgets.txt
@@ -230,6 +230,16 @@ foundation for custom widgets.
            In older versions, this attribute was only defined on the date
            and time widgets (as ``False``).
 
+    .. method:: id_for_label(self, id_)
+
+        Returns the HTML ID attribute of this widget for use by a ``<label>``,
+        given the ID of the field. Returns ``None`` if an ID isn't available.
+
+        This hook is necessary because some widgets have multiple HTML
+        elements and, thus, multiple IDs. In that case, this method should
+        return an ID value that corresponds to the first ID in the widget's
+        tags.
+
     .. method:: render(name, value, attrs=None)
 
         Returns HTML for the widget, as a Unicode string. This method must be
diff --git a/docs/topics/forms/index.txt b/docs/topics/forms/index.txt
index 8133478e82..c9cce5121f 100644
--- a/docs/topics/forms/index.txt
+++ b/docs/topics/forms/index.txt
@@ -690,6 +690,11 @@ Useful attributes on ``{{ field }}`` include:
     :class:`~django.forms.Field` attributes, e.g.
     ``{{ char_field.field.max_length }}``.
 
+.. seealso::
+
+    For a complete list of attributes and methods, see
+    :class:`~django.forms.BoundField`.
+
 Looping over hidden and visible fields
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^