Flask WTForms:未发送字段值

Flask WTForms: Field Values Not Being Sent

我第一次尝试用 flask、bootstrap 和 wtforms 建立一个小网站。我 运行 遇到了一个问题,我的 wtforms 字段在提交时没有发送值。我有一个非常基本的 wtform 定义如下:

class GeneralForm(Form):
    boolean_val = BooleanField('Boolean')
    a_float = FloatField('Severity')
    submit = SubmitField('Submit')

我还有一个 html 模板,我在其中呈现表单:

{% block content %}
    <div class="col-md-12">
        {{form|render_form()}}
    </div>
{%- endblock %}

一切都很好。提交表单后,我会这样检查:

@app.route('/form', methods=['GET', 'POST'])
def do_form():
    general_form = GeneralForm()

    if general_form.validate_on_submit():
        return "Value {}".format(general_form.boolean_val.data)

    return render_template('symptomsform.html', form=general_form)

我发现布尔字段的值始终是默认值 (false)。我还注意到,当我检查浮点字段时,只提供了一个默认值。我检查了页面的 html,我发现输入字段看起来像:

<label for="boolean_val">
  <input type="checkbox">Boolean
</label>

让我印象深刻的是输入字段的标签中缺少名称。所以,我手动输入了名称,我的测试应用程序收到了复选框的实际值。

我的问题是:我在创建输入字段时做错了什么,以至于字段的值没有随表单提交一起发送?我怀疑输入字段应该有名称。那么,为什么输入字段中没有生成名称?

下面是包含修复的示例脚本,

app.py

from flask import Flask, render_template
from flask_wtf import Form
from wtforms import SubmitField, BooleanField, FloatField
from flask import request
from jinja2 import filters


app = Flask(__name__)
app.config['SECRET_KEY'] = 'catchmeifyoucan'

class GeneralForm(Form):
    boolean_val = BooleanField('Boolean')
    a_float = FloatField('Severity')
    submit = SubmitField('Submit')


@app.route('/wtforms', methods=['GET', 'POST'])
def debug_wtforms():
    form = GeneralForm()
    if request.method == 'POST' and form.validate_on_submit():
        print(form.boolean_val.data)
        print(form.a_float.data)
    return render_template('index.html', form=form)


# This is a jinja2 custom filter for rendering a form
@app.template_filter()
def render_form(form, action='/', method='post'):
    temp = ''
    start_form = "<form action=" + action + " method=" + method + ">"
    end_form = "</form>"
    temp += start_form
    for el in form:
        temp += str(el())
    temp += end_form
    return filters.do_mark_safe(temp)


if __name__ == "__main__":
    app.run(debug=True)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Wtforms debug</title>
</head>
<body>
{{ form | render_form(action=url_for('debug_wtforms')) }}
</body>
</html>

下面给出的自定义 jinja2 过滤器可以帮助您呈现具有 name 属性的表单,

# This is a jinja2 custom filter for rendering a form
@app.template_filter()
def render_form(form, action='/', method='post'):
    temp = ''
    start_form = "<form action=" + action + " method=" + method + ">"
    end_form = "</form>"
    temp += start_form
    for el in form:
        temp += str(el())
    temp += end_form
    return filters.do_mark_safe(temp)

此过滤器有两个默认参数,action 和 method,如果您想修改表单方法和操作,可以传递这两个参数。

当前过滤器不会显示表单字段标签,但如果你想显示表单字段标签,你可以使用str(el.label())访问它并将它附加到自定义过滤器中的临时变量。

注意:您可以对自定义过滤器进行必要的调整,以修改表单的显示方式

希望对您有所帮助。