【问题标题】:flask-wtf EqualTo validator not doing anythingflask-wtf EqualTo 验证器不做任何事情
【发布时间】:2022-01-08 05:33:10
【问题描述】:

我正在尝试制作一个注册页面并有两个密码字段:密码和密码2。

我遵循了文档,还尝试了论坛和堆栈溢出问题的许多不同变体,但它们似乎都不起作用。

这是我的代码:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, EmailField
from wtforms.validators import InputRequired, Length, EqualTo

class LoginForm(FlaskForm):
    username = StringField('Username', validators=[InputRequired(), Length(min=4, max=15)])
    password = PasswordField('Password', validators=[InputRequired(), Length(min=8, max=80)])
    remember = BooleanField('Remember Me')

class SignupForm(FlaskForm):
    email = EmailField('Email', validators=[InputRequired(), Length(max=64)])
    username = StringField('Username', validators=[InputRequired(), Length(min=4, max=15)])
    password = PasswordField('Password', validators=[InputRequired(), Length(min=8, max=80)])
    password2  = PasswordField('Confirm Password', validators=[InputRequired(), EqualTo('password', message='Passwords must match')])

和模板:

{% extends 'base.html' %}
{% block content %}

<form class="mx-auto" style="max-width:30rem;" method="POST">
  <h1>{{ title }}</h1>
  <div class="mb-3">
    {{ form.email.label(class_='form-label') }}
    {{ form.email(class_='form-control') }}
  </div>
  <div class="mb-3">
    {{ form.username.label(class_='form-label') }}
    {{ form.username(class_='form-control') }}
  </div>
  <div class="mb-3">
    {{ form.password.label(class_='form-label') }}
    {{ form.password(class_='form-control') }}
  </div>
  <div class="mb-3">
    {{ form.password2.label(class_='form-label') }}
    {{ form.password2(class_='form-control') }}
  </div>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>

在提交时,无论密码是否匹配,都会发送请求。不太清楚我哪里出错了。

所有其他验证器似乎都按预期工作

【问题讨论】:

  • “请求被发送”是什么意思?您能否将代码提供给使用此表单的路线?

标签: python forms flask flask-wtforms flask-login


【解决方案1】:

我认为验证器的行为与我的预期不同。我认为当我尝试提交表单时它会标记为不匹配的密码,就像电子邮件不是有效的电子邮件地址一样。实际上,一旦将发布请求发送到路由,它就会标记错误。我决定在路由中处理这些错误并将它们传递给模板,如下所示:

@account.route('/signup', methods=['GET', 'POST'])
def signup():
    form = SignupForm()

    if form.validate_on_submit():
        # username = request.form.get('username')
        # password = request.form.get('password')
        # email = request.form.get('email')

        return 'IT WORKED'
    

    errors = [{'field': key, 'messages': form.errors[key]} for key in form.errors.keys()] if form.errors else []

    return render_template('account/signup.html', title='Signup', 
        form=form, 
        errors=errors
    )

然后在模板中:

  <ul>
    {% for field in errors %}
      {% for message in field.messages %}
      <li>{{ message }}</li>
      {% endfor %}
    {% endfor %}
  </ul>

我不知道这是否是最佳实践,但它有效并且相对干净

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多