我第一次开始创建一个带有烧瓶,引导程序和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>
对我来说突出的是输入字段在其标记中缺少名称。所以,我手动插入名称,我的测试应用程序正在接收复选框的实际值。
我的问题是:创建输入字段时我做错了什么,以至于字段的值没有与表单提交一起发送?我怀疑输入字段应该有名字。那么,为什么不在输入字段上生成名称?
答案 0 :(得分:1)
以下是包含修复程序的示例脚本
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())
访问它并将其附加到自定义过滤器中的temp变量。
注意:您可以对自定义过滤器进行必要的调整,以修改表单的显示方式
我希望这会有所帮助。