WTForms 似乎无法验证 SelectField 框

WTForms can't seem to validate a SelectField box

我制作了一个 select 字段供员工选择他们的名字。 我的目标是当用户没有 select 他们的名字,而是将下拉框留在 select 离子“---”上时,在这种情况下,我希望 ValidationError 然后打印它的消息。目前,当我对此进行测试时,没有打印任何内容。

这是我的 forms.py 个文件:

from flask_wtf import Form
from wtforms import StringField, BooleanField, SelectField
from wtforms.validators import DataRequired, Required, ValidationError 

class StaffNames(Form):
        staff = SelectField(
        'staff',
        choices=[("", "---"), ('1', 'John Jones'), ('2', 'Chris Hughes'), ('3', 'Lyn Fox')],
        )
        def validate_staff(form, field):
                if field.data is "---":
                        raise ValidationError("Sorry, you havn't chosen a staff name")

这是我的 view.py 文件:

from flask import render_template, flash, redirect
from app import app
from .forms import StaffNames

@app.route('/')
@app.route('/index', methods=['GET', 'POST'])
def index():
    form = StaffNames()
    if form.validate_on_submit():
        return redirect('/results')
    return render_template('index.html',
                           title='RA Index Search',
                           form=form)

这是我的 index.html 与此表格相关的内容:

<!-- extend base layout -->
{% extends "base.html" %}

{% block content %}
<center>
    <h1>Search</h1>
    <form action="" method="post" name="login">

        <p>{{ form.staff }} Select your name</p>
        <p><input type="submit" value="Search"></p>
    </form>

{% endblock %}

任何人都可以看到我做错了什么或提出一个不会融化我的大脑的替代方案!哈哈 谢谢

据我所知,您的代码中有两个错误:

  1. 您需要包含一个 csrc_token in your template form 否则您的 form.validate_on_submit() 方法将始终 return False。还要确保将 app.config['SECRET_KEY'] 设置为某个值。

  2. 在您的验证方法中,您检查 SelectBox 的数据 属性 是否为“---”。这永远不会发生,因为 data 指的是您在 choices.

  3. 列表中传递的元组的第一个值

按照以下方式更改您的 validate_staff 方法,您应该没问题:

def validate_staff(form, field):
    if field.data == "":
        raise ValidationError("Sorry, you havn't chosen a staff name")

class StaffNames(Form):

    staff = SelectField(
        'staff',
        choices=[
            ("", "---"), ('1', 'John Jones'), ('2', 'Chris Hughes'), ('3', 'Lyn Fox')],
        validators=[validate_staff],
    )

注意:您需要将 validate_staff 函数传递给 StaffNames 表单的验证器列表,否则永远不会触发验证。我相应地更改了上面的代码。