1

WTFormsで検証を追加したいSelectFieldがあります。フィールドは動的ドロップダウンから値を取得します。これは、ユーザーが最初に地域を選択し、次に都市オプションを切り替えて選択した地域の都市を表示する、地域と都市の選択のペアの都市フィールドであるためです。

ここに画像の説明を入力してください

フォームクラスと同じ名前に設定した場合でも、入力に対して検証を実行できます。

<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の検証を有効にする方法を知りたいですか?他のすべてのフィールドで機能します。フィールドの周りの赤い枠を有効にするために、Selectクラスをサブクラス化し、これをウィジェットとして追加しようとしました。これは、他のフィールドでは機能しますが、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を検証用に有効にする方法を教えてください。

ありがとう

4

1 に答える 1

2

バリデーターAnyOfをもう試しましたか?http://wtforms.simplecodes.com/docs/0.6/validators.htmlを参照してください

class wtforms.validators.AnyOf(values、message = u'無効な値。次のいずれかである必要があります:%(values)s'、values_formatter = None)受信データを一連の有効な入力と比較します。

于 2012-07-17T12:39:41.653 に答える