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())
访问它并将它附加到自定义过滤器中的临时变量。
注意:您可以对自定义过滤器进行必要的调整,以修改表单的显示方式
希望对您有所帮助。
我第一次尝试用 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())
访问它并将它附加到自定义过滤器中的临时变量。
注意:您可以对自定义过滤器进行必要的调整,以修改表单的显示方式
希望对您有所帮助。