为什么 StringField 总是 None?
Why is the StringField always None?
我正在尝试使用 Flask、WTForms 和通过 flask-Bootstrap 提供的宏来读取表单。这在某些情况下有效,而在其他情况下(看似相似的情况下)则无效。当我检查特定 StringField 的内容时,它总是评估为 None,未通过 InputRequired() 验证。
forms.py:
from wtforms import Form, validators, \
StringField, PasswordField, SubmitField, \
SelectField, RadioField
from wtforms.fields.html5 import DateField
from wtforms.validators import ValidationError, InputRequired, NoneOf, \
EqualTo, Length, Optional
class TestForm(Form):
name = StringField('Name', [validators.InputRequired(message='Please enter name!')])
date = DateField('Date', format='%Y-%m-%d') #, default=date.today())
address = StringField('Address')
submit = SubmitField('Add')
test.py:
from flask import render_template, redirect, request
from flask_security import login_required
from application.routes import routes
from application.forms import TestForm
@routes.route('/test', methods=['POST', 'GET'])
@login_required
def test():
form = TestForm()
print(form.name.data)
if request.method == 'POST' and form.validate():
print("validated")
return redirect("/")
return render_template('test.html', title="Asset Manager", form=form)
test.html:
{% extends 'layout.html' %}
{% import "bootstrap/wtf.html" as wtf %}
{% block content %}
<div class="container-fluid">
<h3><u>Test:</u></h3>
<br>
<div class="container-fluid col-md-3">
<form action="" method="POST" class="form" role="form" onsubmit="/">
<div class="row">
<div class="col-md-12">
{{ wtf.form_field(form.name, form_type="inline", placeholder="Name") }}
</div>
</div>
<div class="row">
<div class="col-md-5">
{{ wtf.form_field(form.date) }}
</div>
</div>
<div class="row">
<div class="col-md-12">
{{ wtf.form_field(form.address) }}
</div>
</div>
{{ wtf.form_field(form.submit, class="btn btn-primary") }}
</form>
{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alert">×</button>
{{ message }}
</div>
</div>
{% endfor %}
</div>
{% endblock %}
这总是输出 None 因此即使我输入名称并按 Add[=32 也永远不会通过验证检查=] 按钮。
我尝试创建一个最小的示例(它仍然表现出同样的问题),但我遗漏了应用程序的大部分内容,所以如果您需要更多信息 - 请告诉我,我很乐意提供它们。
感谢 Marc,我找到了我遗漏的地方。在实例化表单时,我需要将请求作为参数传递。
所以行
form = TestForm()
需要改为
form = TestForm(request.form)
使应用程序正常工作。
我正在尝试使用 Flask、WTForms 和通过 flask-Bootstrap 提供的宏来读取表单。这在某些情况下有效,而在其他情况下(看似相似的情况下)则无效。当我检查特定 StringField 的内容时,它总是评估为 None,未通过 InputRequired() 验证。
forms.py:
from wtforms import Form, validators, \
StringField, PasswordField, SubmitField, \
SelectField, RadioField
from wtforms.fields.html5 import DateField
from wtforms.validators import ValidationError, InputRequired, NoneOf, \
EqualTo, Length, Optional
class TestForm(Form):
name = StringField('Name', [validators.InputRequired(message='Please enter name!')])
date = DateField('Date', format='%Y-%m-%d') #, default=date.today())
address = StringField('Address')
submit = SubmitField('Add')
test.py:
from flask import render_template, redirect, request
from flask_security import login_required
from application.routes import routes
from application.forms import TestForm
@routes.route('/test', methods=['POST', 'GET'])
@login_required
def test():
form = TestForm()
print(form.name.data)
if request.method == 'POST' and form.validate():
print("validated")
return redirect("/")
return render_template('test.html', title="Asset Manager", form=form)
test.html:
{% extends 'layout.html' %}
{% import "bootstrap/wtf.html" as wtf %}
{% block content %}
<div class="container-fluid">
<h3><u>Test:</u></h3>
<br>
<div class="container-fluid col-md-3">
<form action="" method="POST" class="form" role="form" onsubmit="/">
<div class="row">
<div class="col-md-12">
{{ wtf.form_field(form.name, form_type="inline", placeholder="Name") }}
</div>
</div>
<div class="row">
<div class="col-md-5">
{{ wtf.form_field(form.date) }}
</div>
</div>
<div class="row">
<div class="col-md-12">
{{ wtf.form_field(form.address) }}
</div>
</div>
{{ wtf.form_field(form.submit, class="btn btn-primary") }}
</form>
{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alert">×</button>
{{ message }}
</div>
</div>
{% endfor %}
</div>
{% endblock %}
这总是输出 None 因此即使我输入名称并按 Add[=32 也永远不会通过验证检查=] 按钮。 我尝试创建一个最小的示例(它仍然表现出同样的问题),但我遗漏了应用程序的大部分内容,所以如果您需要更多信息 - 请告诉我,我很乐意提供它们。
感谢 Marc,我找到了我遗漏的地方。在实例化表单时,我需要将请求作为参数传递。 所以行
form = TestForm()
需要改为
form = TestForm(request.form)
使应用程序正常工作。