wtform中的密码字段填充不正确



我有一个设置页面,用户可以在其中更改数据(包括密码(。他们应该能够在每次不提供密码的情况下更改一些数据。但看起来PasswordField没有正确填充,我不知道在哪里查找问题。我打开设置页面,如果我想更改表单中的任何内容;密码必须匹配";每次都会出错。调试后,我可以看到password_change有正确的值,但password_confirm是空的。我每次都需要手动提供password_confirm值。它不应该是必需的。wtforms如何填充PasswordField,为什么不起作用?

view.py

else:  # GET
form = UserEditForm(obj=acc)
return render_template('account/view.html', account=acc, form=form)
class UserEditForm(Form):
name = StringField('Account name', [DataOptional(), validators.Length(min=3, max=64)])
email = StringField('Email address', [
IgnoreUnchanged(),
validators.Length(min=3, max=254),
validators.Email(message='Must be a valid email address'),
EmailAvailable(),
validators.EqualTo('email_confirm', message='Email confirmation must match'),
])
email_confirm = StringField('Confirm email address')
password_change = PasswordField('Change password', [
validators.EqualTo('password_confirm', message='Passwords must match'),
])
password_confirm = PasswordField('Confirm password')
<div class="form__question">
{{ render_field(form.password_change, placeholder="********") }}
</div>
<div class="form__question">
{{ render_field(form.password_confirm, placeholder="********") }}
</div>

您可以尝试类似的操作,将密码字段设置为可选字段,然后仅在password_change字段中存在数据时才需要password_confirm字段

password_change = PasswordField(
'password',
validators=[DataOptional(), validators.Length(min=6, max=255)]
)
password_confirm = PasswordField(
'Repeat password',
validators=[
RequiredIf('password_change'),
EqualTo('password_change', message='Passwords must match.')
]
)

为RequiredIf创建一个验证器类

来源->如何在WTForms中使字段有条件可选

class RequiredIf(InputRequired):
# a validator which makes a field required if
# another field is set and has a truthy value
def __init__(self, other_field_name, *args, **kwargs):
self.other_field_name = other_field_name
super(RequiredIf, self).__init__(*args, **kwargs)
def __call__(self, form, field):
other_field = form._fields.get(self.other_field_name)
if other_field is None:
raise Exception('no field named "%s" in form' % self.other_field_name)
if bool(other_field.data):
super(RequiredIf, self).__call__(form, field)

最新更新