WTForms似乎无法验证SelectField框

时间:2017-05-30 09:52:28

标签: python flask wtforms flask-wtforms

我已经为员工选择了他们的名字。 我的目标是当用户没有选择他们的名字时,而是在选择中留下下拉框" ---",在这种情况下我希望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 个答案:

答案 0 :(得分:0)

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

  1. 您需要添加csrc_token in your template form,否则您的form.validate_on_submit()方法将始终返回False。另外,请务必将app.config['SECRET_KEY']设置为某个值。

  2. 在验证方法中,检查SelectBox的数据属性是&#39; ---&#39;。这绝不会发生,因为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表单的验证器列表,否则验证将永远不会被触发。我相应地更改了上面的代码。