【发布时间】: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