WTF 表单未验证



由于某种原因,我的wtf表单似乎没有验证。当表单使用已经存在的用户名完成并且我按提交时,页面将保留在原处,并且尽管在代码中,但不会引发验证错误。具有新用户名的用户可以很好地添加到数据库中。

希望有人可以将代码复制/粘贴到文本编辑器中并使其运行:

这是表格:

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators = [DataRequired()])
    password = PasswordField('Password', validators = [DataRequired()])
    submit = SubmitField('Register')
    def validate_username(self,field):
        if UserRegistration.query.filter_by(username=field.data).first():
            raise ValidationError('Your username has been registered already!')

下面是模型类:

class UserRegistration(db.Model, UserMixin):
__tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.Text, unique=True, index=True)
    password_hash = db.Column(db.Text(128))

    def __init__(self, username, password):
        self.username = username
        self.password_hash = generate_password_hash(password)
    def check_password(self, password):
        return check_password_hash(self.password_hash, password)
    def __repr__(self):
        return f"Username {self.username}"

这是视图:

@users.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        username = form.username.data
        password = form.password.data
        user = UserRegistration(username, password)
        db.session.add(user)
        db.session.commit()
        flash(f'Thanks for registering! Your credentials are: Username: {username}, Password: {password}')
        return redirect(url_for('users.all_users'))
    return render_template('register.html', form=form)

这是表单所在的 html 文档:

{% extends 'base.html' %}
{% block content %}
<div class="container col-md-8 col-md-offset-2">
  <h1>Registration Form</h1> <br>
    <form method="POST">
      {{form.hidden_tag()}}
      <div class="form-group">
        {{form.username.label()}}
        {{form.username(class='form-control form-text text-muted')}}
      </div>
      <div class="form-group">
        {{form.password.label()}}
        {{form.password(class='form-control form-text text-muted')}}
      </div>
      <div class="form-group">
        {{form.submit(class="btn btn-primary")}}
      </div>
    </form>
</div>
{% endblock %}

WTForm内联验证程序方法必须使用以下约定:validate_<field_name> .

在您的示例中,您感兴趣的表单字段(即需要验证的表单字段(如下: [username, email]因此您的验证方法必须是:validate_username(...)和尊重validate_email(...)。而不是check_email(...)check_username(...)这不是WTForm对在线验证器的期望......

尝试重命名验证方法以符合WTForm内联规范,大致如下:

def validate_email(self,field):
    # check is none for that user email!
    if UserRegistration.query.filter_by(email=field.data).first():
        raise ValidationError('Your email has been registered already!')
def validate_username(self,field):
    if UserRegistration.query.filter_by(username=field.data).first():
        raise ValidationError('Your username has been registered already!')

希望对您有所帮助!

最新更新