我有一个烧瓶表单,当选中“行车距离”复选框并提交表单时,用户将转到一个新页面,询问您的地址。但是,提交第二份表格后,我将被发送回第一份表格页面。
我在运行form.errors
之后打印了form.validate_on_submit()
,并且第一个表格提交正常。第二个似乎正在加载时提交,它引发了:
{'address': ['This field is required.']}
当我输入输入并提交第二个表单时,我在第一个表单的必填字段中收到错误消息。
这是我能以最少的特异性重新创建代码的最佳方法:
forms.py
class MainForm(FlaskForm):
states = TextAreaField(
'States',
validators=[
DataRequired(),
Length(min=4, max=471)
],
render_kw={
'rows': '10',
'cols': '77'
}
)
driving_distance = BooleanField(
'Driving Distance',
render_kw={'class': 'checkbox'}
)
# showDiv is a javascript function that hides the regular page contents and displays a loading screen
submit = SubmitField('Find Competitions Near You', render_kw={'onclick': 'showDiv()'})
class AddressForm(FlaskForm):
address = StringField(
'Address or Coordinates:',
validators=[DataRequired()],
render_kw={'size': '79'}
)
submit = SubmitField('Submit Address', render_kw={'onclick': 'showDiv()'})
app.py
@app.route("/output")
def output_page(states, address=False):
if address:
output = backend_function(states, address)
else:
output = backend_function(states)
return render_template('output.html', output=output)
@app.route("/address", methods=['GET', 'POST'])
def address_form_page(states):
form = AddressForm()
if form.validate_on_submit():
return output_page(states, form.address.data)
return render_template('address.html', form=form)
@app.route("/form", methods=['GET', 'POST'])
def main_form_page()
form = MainForm()
if form.validate_on_submit():
states = [state.strip() for state in states.data.split('\n')]
if form.driving_distance.data:
return address_form_page(states)
return render_template('main_form.html', form=form)
main_form.html
<form method="POST" action="">
{{ form.hidden_tag() }}
{{ form.states.label() }}
{{ form.states() }}
{{ form.submit() }}
</form>
address.html
<form method="POST" action="">
{{ form.hidden_tag() }}
{{ form.address.label() }}
{{ form.address() }}
{{ form.submit() }}
</form>
我认为正在发生的是,当我提交它时,我的url仍然是原始表单的URL,它将我发送到新表单,因此它正在重新加载并期望向我已经提交的表单输入新的内容。我认为可以通过使用flask中的redirect()
函数来解决此问题,但是我不知道在给address_page提供输入时该怎么做。如果真是这样,我如何在使用重定向功能时将这些输入提供给address_page,或者避免完全使用该功能?
我的另一种猜测是第二种表单正在加载时提交,如果这样,我该如何更改?我以为发生这种情况是因为使用navigator.geolocation
api的“使用当前位置”选项可以找到您的坐标,但是即使我禁用了它,这种情况仍然会发生。
要注意的最后一件有趣的事情是,当我没有输入地址表格并提交时,而不是得到一个错误,它开始加载似乎永远不变的东西。
更新
我通过将表单输入表单的主表单发送给地址表单函数访问的全局变量(而不是作为参数)来检查我的第一个推测是否正确,并且它起作用了,不同之处在于它认为第一个表格的输入为空。