我一直在处理一个表单,它将数据发送给一个scraper并同时从表单输入生成一个URL。返回的模板运行完美,但URL更改最终给了我URL中的整个表单,我无法弄清楚原因。
网址最终看起来像这样:
http://localhost/options/%3Cinput%20id%3D%22symbol%22%20name%3D%22symbol%22%20type%3D%22text%22%20value%3D%22%22%3E
我希望它看起来像这样:
http://localhost/options/ABC
表格类:
class OptionsForm(Form):
symbol = StringField('Enter a ticker symbol:', validators=[Required(), Length(min=1, max=5)])
submit = SubmitField('Get Options Quotes')
查看:
# Where the form data ends up
@app.route('/options/<symbol>', methods=['GET', 'POST'])
def options(symbol):
# Created this try/except so I could test functionality - for example, I can do 'localhost/options/ABC' and it works
try:
symbol = request.form['symbol']
except:
pass
return render_template('options.html', symbol=symbol, company_data=OS.pull_data(symbol, name=True))
# Where the form lives
@app.route('/', methods=['GET', 'POST'])
def index():
form = OptionsForm()
print(form.errors)
if form.validate_on_submit():
return redirect(url_for('options', symbol=form.symbol.data))
return render_template('index.html', options_form=form)
模板:
<div id="options_div">
<form method="POST" name="symbol_form" action="{{ url_for('options', symbol=options_form.symbol) }}">
{{ options_form.hidden_tag() }}
{{ options_form.symbol(size=10) }}
{{ options_form.submit(size=10) }}
</form>
任何帮助都将不胜感激。
答案 0 :(得分:0)
尝试将enctype='multipart/form-data'
添加到表单标记中。看起来您的表单使用的是application/x-www-form-urlencoded
,默认情况。
修改确定,请检查一下。在呈现模板时,该数据属性中没有值(在url_for调用中)。如果没有引用数据属性(正如您的原始问题所示),那么您将引用实际的表单元素(这就是为什么您会在网址中看到所有html传递的原因)。以下是您的选择(我看到):
使用某种前端javascript将表单的action属性绑定到输入框中的值。像棱角分叉之类的东西会对此有所帮助(但如果你不使用它的任何其他功能,那就太过分了。)
只需将表单POST到/ options(url中没有符号)。然后,从表单数据中获取符号属性。