2012-05-08 3 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? Он работает для всех других областей. Чтобы включить красную рамку вокруг области, я попытался подкласс Выберите класс и добавить в качестве виджета, так как это работает в других областях, но не для 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' 
           )) 

Можете ли вы сказать мне, что я делаю неправильно и как я могу включить мой выбор для проверки?

Благодаря

+1

* cough * javascript * cough * –

ответ

1

Вы пробовали валидатор AnyOf еще? См http://wtforms.simplecodes.com/docs/0.6/validators.html

класса wtforms.validators.AnyOf (значения, сообщение = значение u'Invalid, должно быть одним из:% (значения) S', values_formatter = None) не сравнивает поступающие данные к последовательности действительных входов ,

+0

Похоже, что он может работать. Спасибо за ответ. –

Смежные вопросы