Bootstrap 导航栏搜索将搜索查询发送到 Flask 视图

Bootstrap navbar search to send search query to Flask view

我有一个base.html,其中导航栏有一个搜索框。

        <form class="form-inline my-2 my-lg-0" action={{ url_for('search') }} method="POST">
          <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
          <input class="form-control mr-sm-2" name="search" type="search" placeholder="Search Storage Request" aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
        </form>

视图如下:

@app.route('/search', methods=['GET', 'POST'])
def search():
    query = request.args['search']
    req_search = Storage.query.filter_by(req_no=query)
    return render_template('search.html', req_search=req_search)

但是当我从导航栏搜索框中搜索任何内容时。这是我得到的错误:

query = request.args['search']
AttributeError: 'function' object has no attribute 'args'

不知何故,我无法在视图中抓取搜索查询。

一般来说,搜索请求是使用 GET 方法执行的,您甚至不需要提及 method="GET",因为它是默认方法。此外,您的表单中不需要 csrf_token,因为它是一个 GET 请求。`

所以我建议你在

中修复这些问题

您的模板

<form class="form-inline my-2 my-lg-0" action="{{ url_for('search') }}">
  <input class="form-control mr-sm-2" name="search" type="search" placeholder="Search Storage Request" aria-label="Search">
  <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>

你的视图函数

@app.route('/search')  # 'GET' is the default method, you don't need to mention it explicitly
def search():

    # query = request.args['search']
    query = request.GET.get('search')  # try this instead

    req_search = Storage.query.filter_by(req_no=query)
    return render_template('search.html', req_search=req_search)