title: Enabling validation for my SelectField
body: <p>I have a SelectField that I want to add validation to with WTForms. The fields gets its values from a dynamic dropdown since it is the city field of a pair of region/city choice where the user first select region and then the city options switches to display the cities of the selected region:</p>
  
  <p><img src="https://i.stack.imgur.com/gNHMZ.png" alt="enter image description here"></p>
  
  <p>If I set it to the same name as in the form class then I still can perform validation on the input:</p>
  
  <pre><code>&lt;div id="cities"&gt;
                  {{form.area}}
  &lt;/div&gt;{% if form.area.errors %} &lt;div class="maintext"&gt;
          &lt;ul class="errors"&gt;{% for error in form.area.errors %}&lt;li&gt;{{ error }}&lt;/li&gt;{% endfor %}&lt;/ul&gt;&lt;/div&gt;
      {% endif %}
  </code></pre>
  
  <p>I want a red frame around the fields which do not validate and this works for other fields than the SelectField (see attached image).
  I wonder how to enable validation for my SelectField? It works for all other fields. To enable the red frame around the field I tried to subclass the Select class and add this as a widget since this works for other fields but not for the SelectField:</p>
  
  <pre><code>from wtforms.widgets import Select
  class SelectWithRedFrame(Select):
  
      def __init__(self, error_class=u'has_errors'):
          super(SelectWithRedFrame, self).__init__()
          self.error_class = error_class
  
      def __call__(self, field, **kwargs):
          if field.errors:
              c = kwargs.pop('class', '') or kwargs.pop('class_', '')
              kwargs['class'] = u'%s %s' % (self.error_class, c)
          return super(SelectWithRedFrame, self).__call__(field, **kwargs)
  
  class AdForm(Form):
  
      my_choices = [
          ('1', _('All categories')),
          ('disabled', _('VEHICLES')),
          ('2010', _('Cars')),
          ('3', _('Motorcycles')),
          ('4', _('Accessories &amp; Parts')),
          ('disabled', _('PROPERTIES')),
          ('7', _('Apartments')),
          ('8', _('Houses')),
          ('9', _('Commercial properties')),
          ('10', _('Land')),
          ('disabled', _('ELECTRONICS')),
          ('12', _('Mobile phones &amp; Gadgets')),
          ('13', _('TV/Audio/Video/Cameras')),
          ('14', _('Computers')),
          ('disabled', _('HOME &amp; PERSONAL ITEMS')),
          ('16', _('Home &amp; Garden')),
          ('17', _('Clothes/Watches/Accessories')),
          ('18', _('For Children')),
          ('disabled', _('LEISURE/SPORTS/HOBBIES')),
          ('20', _('Sports &amp; Outdoors')),
          ('21', _('Hobby &amp; Collectables')),
          ('22', _('Music/Movies/Books')),
          ('23', _('Pets')),
          ('20', _('BUSINESS TO BUSINESS')),
          ('24', _('Hobby &amp; Collectables')),
          ('25', _('Professional/Office equipment')),
          ('26', _('Business for sale')),
          ('disabled', _('JOBS &amp; SERVICES')),
          ('28', _('Jobs')),
          ('29', _('Services')),
          ('30', _('Events &amp; Catering')),
          ('31', _('Others')),
          ]
      regions = [
          ('', _('Choose')),
          ('3', _('Delhi')),
          ('4', _('Maharasta')),
          ('7', _('Gujarat')),      
          ]
      cities = [
          ('', _('Choose')),
           ('3', _('Mumbai')),
          ('4', _('Delhi')),     
          ]
      nouser = HiddenField(_('No user'))  # dummy variable to know whether user is logged in
      name = TextField(_('Name'),
                       [validators.Required(message=_('Name is required'
                       ))], widget=MyTextInput())
      title = TextField(_('Subject'),
                        [validators.Required(message=_('Subject is required'
                        ))], widget=MyTextInput())
      text = TextAreaField(_('Ad text'),
                           [validators.Required(message=_('Text is required'
                           ))], widget=MyTextArea())
      phonenumber = TextField(_('Phone'), [validators.Optional()])
      phoneview = BooleanField(_('Display phone number on site'))
      price = TextField(_('Price'), [validators.Regexp('^[0-9]+$',
                        message=_('This is not an integer number, please see the example and try again'
                        )), validators.Optional()], widget=MyTextInput())
      email = TextField(_('Email'),
                        [validators.Required(message=_('Email is required'
                        )),
                        validators.Email(message=_('Your email is invalid'
                        ))], widget=MyTextInput())
  
      region = SelectField(_('Region'),choices=regions,validators=[validators.Required(message=_('Region is required'))],option_widget=SelectWithRedFrame())
      area = SelectField(_('City'),choices=cities,validators=[validators.Required(message=_('City is required'
                        ))],option_widget=SelectWithRedFrame())
  
      def validate_name(form, field):
          if len(field.data) &gt; 50:
              raise ValidationError(_('Name must be less than 50 characters'
                                    ))
  
      def validate_email(form, field):
          if len(field.data) &gt; 60:
              raise ValidationError(_('Email must be less than 60 characters'
                                    ))
  
      def validate_price(form, field):
          if len(field.data) &gt; 8:
              raise ValidationError(_('Price must be less than 9 integers'
                                    ))
  </code></pre>
  
  <p>Can you tell me what I'm doing wrong and how I can enable my SelectField for validation?</p>
  
  <p>Thanks</p>