2012-05-08 47 views
1

我有一個SelectField,我想用WTForms添加驗證。字段獲取其值從動態下拉,因爲它是一對區域/城市選擇的,其中用戶首先選擇區域,然後將城市選項切換到顯示所選擇的區域的城市的城市字段:爲我的SelectField啓用驗證

enter image description here

如果我將其設置爲相同的名稱作爲窗體類,然後我還可以對輸入進行驗證:

<div id="cities"> 
       {{form.area}} 
</div>{% if form.area.errors %} <div class="maintext"> 
     <ul class="errors">{% for error in form.area.errors %}<li>{{ error }}</li>{% endfor %}</ul></div> 
    {% endif %} 

我想圍繞着田野紅框不驗證這一點也適用於其他字段比選擇字段(見附圖)。 我想知道如何爲我的SelectField啓用驗證?它適用於所有其他領域。爲了使周圍的場紅框我試圖子類選擇類,並添加這是一個小部件,因爲這適用於其他領域,但不是爲SelectField:

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 & Parts')), 
     ('disabled', _('PROPERTIES')), 
     ('7', _('Apartments')), 
     ('8', _('Houses')), 
     ('9', _('Commercial properties')), 
     ('10', _('Land')), 
     ('disabled', _('ELECTRONICS')), 
     ('12', _('Mobile phones & Gadgets')), 
     ('13', _('TV/Audio/Video/Cameras')), 
     ('14', _('Computers')), 
     ('disabled', _('HOME & PERSONAL ITEMS')), 
     ('16', _('Home & Garden')), 
     ('17', _('Clothes/Watches/Accessories')), 
     ('18', _('For Children')), 
     ('disabled', _('LEISURE/SPORTS/HOBBIES')), 
     ('20', _('Sports & Outdoors')), 
     ('21', _('Hobby & Collectables')), 
     ('22', _('Music/Movies/Books')), 
     ('23', _('Pets')), 
     ('20', _('BUSINESS TO BUSINESS')), 
     ('24', _('Hobby & Collectables')), 
     ('25', _('Professional/Office equipment')), 
     ('26', _('Business for sale')), 
     ('disabled', _('JOBS & SERVICES')), 
     ('28', _('Jobs')), 
     ('29', _('Services')), 
     ('30', _('Events & 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) > 50: 
      raise ValidationError(_('Name must be less than 50 characters' 
           )) 

    def validate_email(form, field): 
     if len(field.data) > 60: 
      raise ValidationError(_('Email must be less than 60 characters' 
           )) 

    def validate_price(form, field): 
     if len(field.data) > 8: 
      raise ValidationError(_('Price must be less than 9 integers' 
           )) 

你能告訴我,我做錯了什麼以及如何啓用我的SelectField進行驗證?

謝謝

+1

*咳嗽* javascript *咳嗽* –

回答

1

您是否嘗試過驗證器AnyOf呢? 參見http://wtforms.simplecodes.com/docs/0.6/validators.html

類wtforms.validators.AnyOf(值,消息= u'Invalid值,必須是以下之一:%(值)s'的,values_formatter =無) 輸入數據進行比較,以有效輸入序列。

+0

它看起來像它可以工作。感謝你的回答。 –