使用url_for()创建插入URI变量的Flask搜索栏

时间:2016-11-22 15:23:03

标签: python forms flask

我有一个Flask网站,其中有一个'搜索栏'您在其中键入特定位置的位置ID,然后单击Submit以转到该位置的页面(如果存在)。这是当前的表单操作:

<form id="locationinfo" action="{{ url_for('location') }}">

当您点击Submit时,您将被带到/location?info=SITEID,这样就可以了。我想要做的是稍微改变这种行为,以便当用户点击Submit时,他们会被转移到/location/SITEID/。我在我的主要Flask路线文件中设置了装饰器,但是我很难将各个部分放在一起以便将这个简单的形式组合在一起。

@app.route("/location/<locationid>/")
def locations(locationid):
    ...
    return locationid

任何方向都会非常感谢!

[使用当前的完整表单代码编辑]

@app.route("/location")
    def location():
        location_id = request.args.get("info")
<form id="info" action="{{ url_for('location') }}">
    <input type="text" name="info" id="locationfield">
    <button type="submit">Go!</button>
</form>

1 个答案:

答案 0 :(得分:1)

您无法更改HTML表单提交字段的方式,它们将始终位于查询字符串或正文(POST)中。一种选择是使用JavaScript覆盖提交事件以执行您自己的提交并使用结果重新呈现。

更简单的解决方案是在提交后重定向到好的URL。这使“搜索”操作与“显示”操作分开(即使它们由同一视图处理)。

@app.route('/location/')
@app.route('/location/<int:id>/')
def location(id=None):
    # redirect to the second form if the id wasn't in the path
    # raises 400 error if id wasn't in the query
    if id is None:
        return redirect(url_for('location', id=request.args['info']))

    # id is in the path, continue
    ...

如果您想使用id以外的内容进行搜索,可以稍后展开。执行搜索,然后重定向到找到的ID。