将表单放入URL的Flask

时间:2014-09-06 20:08:37

标签: python flask flask-wtforms

我一直在处理一个表单,它将数据发送给一个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>

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

尝试将enctype='multipart/form-data'添加到表单标记中。看起来您的表单使用的是application/x-www-form-urlencoded,默认情况。

修改确定,请检查一下。在呈现模板时,该数据属性中没有值(在url_for调用中)。如果没有引用数据属性(正如您的原始问题所示),那么您将引用实际的表单元素(这就是为什么您会在网址中看到所有html传递的原因)。以下是您的选择(我看到):

  1. 使用某种前端javascript将表单的action属性绑定到输入框中的值。像棱角分叉之类的东西会对此有所帮助(但如果你不使用它的任何其他功能,那就太过分了。)

  2. 只需将表单POST到/ options(url中没有符号)。然后,从表单数据中获取符号属性。