Форма не будет проверяться при использовании WTForms ‘ SelectMultipleField

#python #flask #wtforms #flask-wtforms

#python #flask #wtforms #flask-wtforms

Вопрос:

У меня есть форма, которую я создал с помощью WTForms (используя расширение Flask-WTF), и я использую SelectMultipleField для создания двух групп динамических флажков. У меня возникла проблема, из-за которой, если я проверяю какие-либо поля из группы ориентации, форма не проверяется, но также не выдает мне никаких ошибок проверки. Я также не использую никаких валидаторов для этого поля. Если я отправлю его, не проверяя ничего из группы ориентации, он будет отправлен просто отлично. Если я установлю любой из флажков в группе Subreddit, которая построена почти идентично, форма будет отправлена просто отлично.

Вот мой класс формы:

 class RegistrationForm(Form):
    email = StringField('Email', validators=[Required(), Length(1,64),
                                             Email()])
    username = StringField('Username', validators=[
        Required(), Length(1, 64), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0,
                                          'Usernames must have only letters, '
                                          'numbers, dots or underscores')])
    password = PasswordField('Password', validators=[
        Required(), EqualTo('password2', message='Passwords must match.')])
    password2 = PasswordField('Confirm password', validators=[Required()])
    sex = SelectField('Sex', choices=[('M', 'Male'), ('F', 'Female'), ('T', 'Transgendered')], validators=[Required()])
    min_age = IntegerField('Minimum Age', validators=[Required()])
    max_age = IntegerField('Maximum Age', validators=[Required()])
    city = StringField('City', validators=[Required()])
    state = SelectField('State', validators=[Required()])
    location_alias = StringField('Location Aliases')
    location_radius = IntegerField('Radius of matches (in miles)',
                                    validators=[Required(), NumberRange(min=0,
                                                         max=100,
                                                         message="Radius must be between 0-100 miles.")])
    orientation = SelectMultipleField('Orientation (posts you want to see)',
                                      option_widget=widgets.CheckboxInput(),
                                      widget=widgets.ListWidget(prefix_label=False))
    subreddits = SelectMultipleField('Subreddits',
                                     option_widget=widgets.CheckboxInput(),
                                     widget=widgets.ListWidget(prefix_label=False))

    def validate_min_age(self, field):
        if field.data < 18:
            raise ValidationError("Minimum age must be at least 18.")

    def validate_email(self, field):
        if User.query.filter_by(email=field.data).first():
            raise ValidationError("We already have a user with this email address.")

    def validate_username(self, field):
        if User.query.filter_by(username=field.data).first():
            raise ValidationError("We already have a user with this username.")

    # Data for dynamic checkboxes needs to be initialized when the form is used
    def __init__(self, *args, **kwargs):
        Form.__init__(self, *args, **kwargs)
        self.state.choices = [(s.state, s.state) for s in State.query.all()]
        self.orientation.choices = [(o.orientation, o.orientation) for o in Orientation.query.all()]
        self.subreddits.choices = [(s.subreddit, s.subreddit) for s in Subreddit.query.all()]
  

И вот мое мнение, которое загружает эту форму и вызывает validate_on_submit() :

 @auth.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():

        # get or create the location object
        l = Location.query.filter_by(city=form.city.data, state=form.state.data).first()
        if not l:
            l = Location(city=form.city.data, state=form.state.data)
            db.session.add(l)
            db.session.commit()

        # add the locaton alias
        for location_alias in form.location_alias.data.split('*'):
            if location_alias:
                add_location_alias(l, location_alias)

        # get the orientations
        orientations = []
        for o in form.orientation.data:
            orientation = Orientation.query.filter_by(orientation=o).first()
            if orientation:
                orientations.append(orientation)

        # add the user
        u = User(
            email=form.email.data,
            username=form.username.data,
            password=form.password.data,
            sex=form.sex.data,
            min_age=form.min_age.data,
            max_age=form.max_age.data,
            location_id=l.id,
            location_radius=form.location_radius.data,
            orientations=orientations,
            subreddits=[]

        )
        db.session.add(u)
        db.session.commit()
        print 'User has been added successfully.'
        return redirect(url_for('main.index'))
    print 'Form failed validation.'
    return render_template('auth/register.html', form=form)