繁体   English   中英

WTForms似乎无法验证SelectField框

[英]WTForms can't seem to validate a SelectField box

我为员工创建了一个选择字段,供他们选择姓名。 我的目标是用户不选择名称时,而是将下拉框保留在选项“ ---”上。在这种情况下,我希望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,否则form.validate_on_submit()方法将始终返回False。 还要确保将app.config['SECRET_KEY']为某个值。

  2. 在您的验证方法中,检查SelectBox的data属性是否为“ ---”。 因为这永远不会发生data指的是你在你的名单传元组的第一个值choices

按照以下方式更改您的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表单的验证器列表,否则将永远不会触发验证。 我相应地更改了上面的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM