2012-05-08 8 views
1

私はWFormで検証を追加したいSelectFieldを持っています。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の検証を有効にする方法を知りたいですか?それは他のすべてのフィールドで機能します。私が選択したクラスのサブクラスを作成し、これは他の分野のためではなく、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

それはうまくいくようです。答えをありがとう。 –

関連する問題