我正在编写个人资料页面,但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:
我知道我可以使用乘法视图来管理乘法表单,但是我对子表单感兴趣。
答案 0 :(得分:0)
您应该获得 profile_password 的 form 字段。因此,正确的if语句应为:
if form.profile_password.form.sub_pass.data and form.profile_password.validate(form)