title: Django form field data lost when using custom widget
body: <p>I've written a custom widget for a form field in Django and I'm seeing the kind of HTML output which I want, but the field isn't being returned in the <code>cleaned_data</code>.</p>
  
  <p>The HTML is part of the form in the page, so is there an issue with my widget?</p>
  
  <pre><code># forms.py
  
  class EntrantDetails(forms.Form):
      TITLE_CHOICES = (
          ('', 'Select:'),
          ('Mr', 'Mr'),
          ('Mrs', 'Mrs'),
          ('Miss', 'Miss'),
          ('Ms', 'Ms'),
          ('Dr', 'Dr'),
      )
      GENDER_CHOICES = (
          ('M', 'male'),
          ('F', 'female'),
      )
      title = forms.CharField(
          max_length=20,
          widget=forms.widgets.Select(choices=TITLE_CHOICES)
      )
      first_name = forms.CharField(max_length=200)
      middle_names = forms.CharField(
          label='Middle name(s)',
          max_length=200, required=False
      )
      last_name = forms.CharField(max_length=200)
      date_of_birth = forms.DateField(
          widget=SelectDateWidget(years=range(2015, 1900, -1))
      )
      gender = forms.CharField(
          max_length=1,
          widget=ButtonSelectWidget(cls='test_class', choices=GENDER_CHOICES)
      )
  
  
  # widgets.py
  
  class ButtonSelectWidget(Widget):
      """
      Custom widget to display a choice field more like selectable buttons.
      """
  
      def __init__(self, attrs=None, cls=None, choices=None):
          self.attrs = attrs or {}
          self.cls = cls
          self.choices = choices
  
      def render(self, name, value, attrs=None, choices=()):
          if not choices:
              choices = self.choices
          output = []
          output.append(u'&lt;div class="controls"&gt;')
  
          for choice in choices:
              label = u'{}'.format(choice[1])
              output.append(u'''
              &lt;div class="radio radio-{label}"&gt;
                  &lt;input id="user_{name}_{label}" name="user[{name}]" type="radio" value="{choice}"&gt;
                  &lt;label for="user_{name}_{label}"&gt;{title}&lt;/label&gt;
              &lt;/div&gt;
              '''.format(name=name, choice=choice[0], label=label, title=label.title()))
          output.append(u'&lt;/div&gt;')
  
  
          return mark_safe(u'\n'.join(output))
  </code></pre>