【问题标题】:Flask WTForms subforms and independent validating inside one common formFlask WTForms 子表单和一个通用表单内的独立验证
【发布时间】:2019-10-01 05:50:12
【问题描述】:

我正在编写个人资料页面,但在使用 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:

我知道我可以使用多重视图来管理多重表单,但我对子表单很感兴趣。

【问题讨论】:

    标签: flask flask-wtforms subform


    【解决方案1】:

    您应该获得 profile_passwordform 字段。所以,正确的 if 语句应该是:

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

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      相关资源
      最近更新 更多