2016-11-22 42 views
1

我有一个Flask站点,它有一个“搜索栏”,您在其中键入特定位置的位置ID,然后单击Submit以进入页面该位置,如果存在。下面是目前的形式作用:创建一个用url_for()插入URI变量的Flask搜索栏

<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

您不能更改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。