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を検証用に有効にする方法を教えてください。
ありがとう