<p>我可以想出两种可能的解决方案<br/>
<strong>首先</strong>:我认为在验证器列表中的自定义验证器后面应该有一组括号</p>
<pre><code>from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Length, EqualTo
from validators import UniqueRequired, VaildUsername, ValidPassword
class LoginForm(FlaskForm):
username = StringField("Username:", validators=[DataRequired(), VaildUsername()], id="username")
password = PasswordField("Password:", validators=[DataRequired(), ValidPassword()], id="password")
class RegisterForm(FlaskForm):
username = StringField("Username:", validators=[DataRequired(), UniqueRequired(), Length(min=5, max=25)], id="username")
password = PasswordField("Password:", validators=[DataRequired(), Length(min=8)], id="password")
confirmpassword = PasswordField("Confirm Password:", validators=[DataRequired(), EqualTo('password', message="Passwords don't match")], id="conpassword")
</code></pre>
<p><strong>Second</strong>:您可以为表单类中的每个类成员创建单独的方法。<br/>
当调用“提交时验证”时,将自动调用它们。<br/>
你可以这样做</p>
<pre><code>from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Length, EqualTo
class LoginForm(FlaskForm):
username = StringField("Username:", validators=[DataRequired()], id="username")
password = PasswordField("Password:", validators=[DataRequired(), ValidPassword], id="password")
# validate_<fieldname> method will automatically validate
def validate_username(self,field):
user = User.query.filter_by(username=field.data).first()
# print(user)
if not user:
raise ValidationError("Invalid Username")
class RegisterForm(FlaskForm):
username = StringField("Username:", validators=[DataRequired(), UniqueRequired, Length(min=5, max=25)], id="username")
password = PasswordField("Password:", validators=[DataRequired(), Length(min=8)], id="password")
confirmpassword = PasswordField("Confirm Password:", validators=[DataRequired(), EqualTo('password', message="Passwords don't match")], id="conpassword")
</code></pre>
<br/>
我已经给出了LoginForm中唯一用户名字段的示例,如您所见,您也可以对其他字段执行类似操作。