【问题标题】:How to validate multiple flask forms in a single method?如何在单一方法中验证多个烧瓶形式?
【发布时间】:2020-02-14 05:50:08
【问题描述】:

我正在以相同的方法验证三个表单,我能够验证三个表单中的两个,但第三个表单没有验证。

views.py
......
@main.route('/tournament/<tid>', methods=["GET", "POST"])
def tournament(tid):
    ......
    form1 = AddTeamForm()
    form2 = CreateTeamForm()
    form3 = CreateMatchForm()

    # Dynamic allocation of team choices
    team_choices = [(team.id, team.name) for team in tournament.teams]
    form3.team1.choices = team_choices
    form3.team2.choices = team_choices

    if form1.validate_on_submit():
        .....
        return redirect(url_for('main.tournament', tid=tid))

    if form2.validate_on_submit():
        .....
        return redirect(url_for('main.tournament', tid=tid))

    if form3.validate_on_submit():
        print('Passed the validation')
        team1 = Team.query.get(int(form3.team1.data))
        team2 = Team.query.get(int(form3.team2.data))
        match = Match(
            tournment_id=tid,
            name=team1.name+' Vs '+team2.name,
            match_date=form3.match_date.data)
        match.teams.append(team1)
        match.teams.append(team2)
        db.session.add(match)
        db.session.commit()
        return redirect(url_for('main.tournament', tid=tid))

    return render_template(
        'main/tournment.html',
        form1=form1,
        form2=form2,
        form3=form3)

forms.py
....
class CreateMatchForm(FlaskForm):
    team1 = SelectField('Team1',  coerce=int, validators=[DataRequired()])
    team2 = SelectField('Team2',  coerce=int, validators=[DataRequired()])
    match_date = DateField('Match Date', validators=[DataRequired()], 
        render_kw={'type': 'date'},
        default=date.today()+timedelta(days=1))
    submit = SubmitField('Create New Match')


tournment.html
....
<form class="form-inline" method="POST" action="{{ url_for('main.tournament', tid=tid) }}">
    {{ form3.hidden_tag() }}
    {{ form3.team1(class="form-control m-2")}}
    {{ form3.team1(class="form-control m-2")}}
    {{ form3.match_date(class="form-control m-2")}}
    {{ form3.submit(class="form-control m-2 btn btn-success btn-sm")}}
</form>

这是 UI 的外观:

发布请求后:

它甚至没有打印打印/错误消息。

第三种形式没有验证任何值,所以没有创建匹配。我尝试在烧瓶外壳中使用相同的脚本创建匹配项,它完美地工作并且正在创建匹配项,但我无法使用此表单创建。我该如何度过呢?

【问题讨论】:

  • form2 验证成功了吗?
  • @janmpeterka 是的,蓝色药丸中的名称是使用 form2 创建的。
  • 它们已创建,但是否经过验证?尝试在您的代码中找出事情停止按预期发生的确切位置。
  • @janmpeterka 是的,它们是被创建的。提交 form3 后,我将使用之前填写的表单值重定向回同一页面,并且不会在命令提示符上打印任何错误消息。为了检查 form3 是否得到验证,我将打印语句作为第一行,它甚至没有打印。所以,可能是 form3 没有验证,我没有发现任何不验证该表单的问题。
  • 如果你的print 没有被执行,我猜这个代码分支根本没有运行。如果 form1 或 form2 验证成功,它会运行重定向,之后不会执行任何代码(包括 form3 验证)。

标签: python forms flask flask-wtforms wtforms


【解决方案1】:

我想出了一个临时解决方案。我没有使用烧瓶表单,而是使用了原始的 html 表单,并且效果很好。

在views.py中用请求对象替换了form3:

if request.method == "POST":
        print('Passed the validation')
        team1 = Team.query.get(int(request.form['team1']))
        team2 = Team.query.get(int(request.form['team2']))
        match = Match(
            tournament_id=tid,
            name=team1.name+' Vs '+team2.name,
            match_date=request.form['match_date'])
        match.teams.append(team1)
        match.teams.append(team2)
        db.session.add(match)
        db.session.commit()
        return redirect(url_for('main.tournament', tid=tid))

用原始 html 表单替换烧瓶表单:

<form class="form-inline" method="POST" action="{{ url_for('main.tournment', tid=tid) }}">
    <select class="form-control m-2" id="team1" name="team1" required="">
        {% for team in tournament.teams %}
            <option value={{team.id}}>{{team.name}}</option>
        {% endfor %}
    </select>
    <select class="form-control m-2" id="team2" name="team2" required="">
        {% for team in tournament.teams %}
            <option value={{team.id}}>{{team.name}}</option>
        {% endfor %}
    </select>
    <input class="form-control m-2" type="date" name="match_date" required="">
    <input class="form-control m-2 btn btn-success btn-sm" type="submit" value="Create Match">
</form>

现在它按预期工作:

不过,我还是一无所知。为什么使用烧瓶表单不起作用?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2020-11-18
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多