Flask 表单:未发送字段值

Flask 表单:未发送字段值,flask,flask-wtforms,Flask,Flask Wtforms,我第一次尝试用flask、bootstrap和wtforms创建一个小网站。我遇到了一个问题,我的wtforms字段在提交时没有发送值。我有一个非常基本的wtform定义如下: class GeneralForm(Form): boolean_val = BooleanField('Boolean') a_float = FloatField('Severity') submit = SubmitField('Submit') 我还有一个html模板,我在其中呈现表单:

我第一次尝试用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 %}
我发现布尔字段的值总是默认值(false)。我还注意到,当我检查float字段时,只提供了一个默认值。我检查了页面的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)
从烧瓶导入烧瓶,渲染\u模板
来自WASKU wtf进口表格
从wtforms导入SubmitField、BooleanField、FloatField
从烧瓶进口请求
从jinja2导入过滤器
app=烧瓶(名称)
app.config['SECRET_KEY']='catchmeifyoucan'
类别通用格式(表格):
布尔值=布尔域('boolean')
a_float=FloatField(“严重性”)
submit=SubmitField('submit')
@app.route('/wtforms',methods=['GET','POST'])
def DEBUGWTUFORMS():
form=一般形式()
如果request.method==“POST”和form.validate\u on\u submit():
打印(表单布尔值数据)
打印(form.a_float.data)
返回呈现模板('index.html',form=form)
#这是一个用于呈现表单的jinja2自定义过滤器
@app.template_filter()
def render_form(form,action='/',method='post'):
温度=“”
start_form=“”
end_form=“”
temp+=开始形式
对于表格中的el:
temp+=str(el())
温度+=结束形式
返回过滤器。是否标记安全(温度)
如果名称=“\uuuuu main\uuuuuuuu”:
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>

Wtforms调试
{{form | render_form(action=url_for('debugwtforms'))}
下面提供的自定义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)
#这是一个用于呈现表单的jinja2自定义过滤器
@app.template_filter()
def render_form(form,action='/',method='post'):
温度=“”
start_form=“”
end_form=“”
temp+=开始形式
对于表格中的el:
temp+=str(el())
温度+=结束形式
返回过滤器。是否标记安全(温度)
此筛选器有两个默认参数action和method,如果要修改form方法和action,可以传递它们

当前筛选器不会显示表单字段标签,但如果要显示表单字段标签,可以使用
str(el.label())
访问它,并将其附加到自定义筛选器中的temp变量

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


我希望这会有所帮助。

在HTML模板中使用以下
Jinja
语法
{{form.boolean\u val.label}{{form.boolean\u val}}

@GeekSambhu我尝试了你的建议,这导致输入字段生成了一个名称。虽然这解决了问题,但这不是生成大量字段的方便方法。我已经更新了我的问题,包括我的html模板,以防识别出我做错了什么。谢谢。但是,我必须问:是否需要使用自定义过滤器才能使wtforms字段以正确的方式进行渲染?我认为默认的render_form()应该可以为您做到这一点。@Ratnaper np:)很高兴它对您有所帮助。但是你能给我指一下默认render_form()的文档吗,因为我在这里是云中的。我在这里遵循示例应用程序:。再看一眼,我发现它们确实有自己的render_form实现。我意识到我以前错过了这个,doh!我猜在我的表单仍在渲染时,我仍在使用一些“默认”的render_form(),但并不像我预期的那样。到目前为止,我还没有在官方文档中看到任何render_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)