【问题标题】:Flask wtforms ValidationError not displayed to userFlask wtforms ValidationError 未向用户显示
【发布时间】:2021-02-08 05:07:14
【问题描述】:

我正在使用带有输入验证的烧瓶 wtforms。一切正常,除了验证失败,我的 ValidationError 消息没有显示给用户...

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField, ValidationError # URLField, EmailField
from wtforms.validators import DataRequired, Email, EqualTo

class SignupForm(FlaskForm):
    name = StringField("Name:", validators=[DataRequired()])
    email = StringField("Email:", validators=[DataRequired(), Email()])
    password = PasswordField("Password:", validators=[DataRequired(), EqualTo('pass_confirm', message='Passwords must match')])
    pass_confirm = PasswordField("Confirm:", validators=[DataRequired()])
    submit = SubmitField("Create Account")

    def validate_email(self, field):
        if User.query.filter_by(email=field.data).first():
            raise ValidationError('Your email has already been registered.')

    def validate_name(self, field):
        if User.query.filter_by(name=field.data).first():
            raise ValidationError('This username is taken.')

在我看来:

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

    if form.validate_on_submit():
        url = form.name.data # todo: generate unique url
        user = User(name=form.name.data,
                    url=url,
                    email = form.email.data,
                    password = form.password.data)
        db.session.add(user)
        db.session.commit()

        return redirect(url_for('users.login'))

    return render_template('signup.html', form=form)

这是模板:

<div class="jumbotron">
  <h1>Sign up Page</h1>
  <p>Please fill out the form</p>
  <form method="POST">
    {{ form.hidden_tag() }}
    <div class="form-group">
      {{ form.name.label(class='form-group') }}
      {{ form.name(class='form-control') }}
    </div>

    <div class="form-group">
      {{ form.email.label(class='form-group') }}
      {{ form.email(class='form-control') }}
    </div>

    <div class="form-group">
      {{ form.password.label(class='form-group') }}
      {{ form.password(class='form-control') }}
    </div>

    <div class="form-group">
      {{ form.pass_confirm.label(class='form-group') }}
      {{ form.pass_confirm(class='form-control') }}
    </div>

      {{ form.submit(class='btn btn-primary') }}
  </form>

</div>

提交无效的表单(无效的电子邮件或姓名)后,表单只会返回空白,而不会指出用户做错了什么。如何向用户显示这些验证错误?非常感谢!

【问题讨论】:

  • 解决了,非常感谢!
  • 很高兴能帮上忙。但版主可能会以重复的形式关闭您的问题。
  • 这很好 - 最好只有一个问题有很多投票而不是重复。我需要支持我们的答案吗?另外,我能以某种方式给你赏金吗?
  • 我认为我不应该因为写一个简短的评论而获得奖励。别担心,尽情享受吧。

标签: python flask flask-wtforms wtforms


【解决方案1】:

表单必须获取一些数据

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

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

【讨论】:

  • 非常感谢@xiaoqiao 的贡献!不幸的是,这并没有解决我的问题......在用户输入无效输入后,表单仍然返回空白。
【解决方案2】:

我相信您错误地导入了 ValidationError 试试这个从 wtforms.validators 导入它 ->

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField # URLField, EmailField
from wtforms.validators import DataRequired, Email, EqualTo, ValidationError

除此之外,您还可以从您的路线代码中将 Flash 消息添加到屏幕上。

from flask import flash
if form.validate_on_submit():
    flash(f'Info was saved to the database for user {form.name.data}', success)
else:
    flash('Failed to save to database', 'danger')


【讨论】:

  • 感谢您的检查,安德鲁。不幸的是,它现在仍然显示验证错误......如果我弄清楚出了什么问题,我会告诉你的。呵呵,我想我会在很长一段时间内每天回答一个问题才能回到原来的位置;)
  • 如果视图函数闪烁一些消息,模板必须渲染它们:flask.palletsprojects.com/en/1.1.x/patterns/flashing
  • @Muriel 如果你仍然坚持这个,你能分享所有的代码吗?如果我可以自己在本地运行解决方案,我觉得我可以提供帮助
猜你喜欢
  • 1970-01-01
  • 2014-07-28
  • 2021-05-12
  • 2021-07-08
  • 2014-02-05
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多