Flask WTForms子表单和一种常见表单内的独立验证

时间:2019-05-14 08:50:28

标签: flask flask-wtforms subform

我正在编写个人资料页面,但Flask中的子表单遇到了一些麻烦。 例如-我有一个页面,其中包含2个提交按钮和字段,例如-密码和一些注释。

views.py

@auth.route('/profile/<user>', methods=['GET','POST'])
@login_required
def profile(user):
    form=ProfileForm()
    if request.method('POST'):
        if form.profile_password.sub_pass.data and form.profile_password.validate(form):
            db_rw("update users set password=? where username=?",(generate_password_hash(form.profile_password.password1.data), user))
            flash('Password has been updated')
        elif form.profile_notes.sub_info.data and form.profile_avatar.validate(form):
            db_rw("update users set notes=? where username=?",(form.profile_notes.notes.data, user))
            flash('Notes has been updatedd')
    return render_template('auth/profile.html', user=user, form=form)

forms.py

class ProfilePasswordForm(FlaskForm):
    password1 = PasswordField('Password', validators=[DataRequired(),Length(min=3,max=20,message='The password should be at least 8 characters long')]) #!!!!
    password2 = PasswordField('Repeat Password', validators=[EqualTo('password1',message='The passwords are mismatched')])
    sub_pass = SubmitField('Change')

class ProfileNotesForm(FlaskForm):
    notes = TextAreaField('Notes', validators=[Length(min=0, max=150)])
    sub_info = SubmitField('Save')

class ProfileAvatarForm(FlaskForm):
    ava = FileField('Avatar')
    sub_pic = SubmitField('Upload')

class ProfileForm(FlaskForm):
    profile_password=FormField(ProfilePasswordForm)
    profile_notes=FormField(ProfileNotesForm)
    profile_avatar=FormField(ProfileAvatarForm)

profile.html

{% block content %}

  <h3>Hello {{ user }} <br>


    <form action="" method="post" enctype="multipart/form-data" novalidate>
    {{ form.hidden_tag() }}

  <div>
    Change password: <br>

    {{ form.profile_password.password1 }}<br>
         {% for error in form.profile_password.password1.errors  %}
            <span style="color: red;">[{{ error }}]</span>
         {% endfor %}           
    {{ form.profile_password.password2 }}<br>
         {% for error in form.profile_password.password2.errors  %}
        <span style="color: red;">[{{ error }}]</span>
         {% endfor %}
    {{ form.profile_password.sub_pass() }}</p>
  </div>

  <div> 
    Notes: <br>     
    {{ form.profile_notes.notes }}
    {{ form.profile_notes.sub_info }}
  </div>

    </form>
{% endblock %}

所以问题是我想为那个大表格的每个部分有单独的验证器。

但是此代码

if form.profile_password.sub_pass.data and form.profile_password.validate(form)

不返回True,仅在这种情况下起作用。

如果提交了“保存”按钮,则只应运行Notes的验证器,反之亦然,请运行“更改”按钮。

我做错了什么?

jfyi:

我知道我可以使用乘法视图来管理乘法表单,但是我对子表单感兴趣。

1 个答案:

答案 0 :(得分:0)

您应该获得 profile_password form 字段。因此,正确的if语句应为:

if form.profile_password.form.sub_pass.data and form.profile_password.validate(form)