【问题标题】:Pagination in search results with Python/Flask [duplicate]使用 Python/Flask 在搜索结果中分页 [重复]
【发布时间】:2019-11-12 20:05:31
【问题描述】:

我仍在处理我的项目,现在需要搜索数据。通常我会做一个发布请求做一个路由,将搜索字符串作为参数:

@bp.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == 'POST':
        resp = db.session.query(MyTable).filter(MyTable.name.like('%'+request.form['search_name']+'%')).all()
        ... # do something else

我的问题是当搜索结果超过每页最大项目数时如何实现分页。

在没有任何用户操作的情况下显示数据时,分页本身不会成为问题,有几种方法可以使用 Flask-paginate 或通过 Flask-SQLAlchemy 的 paginate() 函数。但是如何通过其他页面传输搜索字符串,因为页面作为 GET 参数给出,?page=x 并且搜索字符串是 POST 参数?

不知何故跑题了,在网上查了很多资料,结果只对正常数据做分页,搜索不到结果。

能给我一个建议吗?

提前非常感谢,问候,托马斯

【问题讨论】:

  • 为什么你不能把page也放在POST参数中?
  • 嗯,这意味着我必须在分页周围包装一个表单,并将每个步骤作为 POST 请求发送,包括搜索字符串作为隐藏字段到路由。但也许一个会话可以帮助我解决这个问题。只是再次阅读一些文件。

标签: python search flask pagination


【解决方案1】:

我想我有一个解决方案 - Flask 的 session 类:

@app.route('/search', methods=['GET', 'POST'])
def search():
    if 'name' in session['search']:
        name = session['search']['name']
    elif request.method == 'POST':
         jboss_name = request.form.get('name')
         session['search']['name'] = name

    page = request.args.get('page', 1, type=int)

    resp = db.session.query(MyTable)\
            .filter(MyTable.name.like('%' + name + '%'))\
            .paginate(page, app.config['ITEMS_PER_PAGE'], False)

    next_url = url_for('search', page=resp.next_num) \
        if resp.has_next else None
    prev_url = url_for('search', page=resp.prev_num) \
        if resp.has_prev else None

    return render_template('search.html',
                            resp=resp,
                            next_url=next_url,
                            prev_url=prev_url)

第一次调用是通过 POST 请求完成的,将数据发送到相应的 app.route。如果还没有设置session值,会在第5行设置。通过session可以保证所有页面都取到原来的搜索字符串。

这可能不是高度发达的,但至少是一个关于如何对搜索结果进行分页的工作示例。在这个简短的 sn-p 中没有实现清除会话。

问候,托马斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多