【问题标题】:Flask-paginate displaying too many resultsFlask-paginate 显示太多结果
【发布时间】:2017-09-26 12:52:12
【问题描述】:

我正在尝试实现烧瓶分页以返回每页特定数量的结果。我关注了docs,它仍在显示所有记录。我还检查了github 的示例,但看不到我做错了什么。我在 python 中的定义:

def dashboard():
   page_size = 1
   files = File.query.order_by(File.title)
   search = False
   q = request.args.get('q')
   if q:
      search = True
   page = int(request.args.get('page',1))
   pagination = Pagination(page=page, total=files.count(), per_page=page_size, css_framework='bootstrap3', search=search)
   return render_template('dashboard.html', files=files, pagination=pagination)

还有html模板:

{% extends "header.html" %}
{% block body %}

<table border=2 padding=10>
   <tr padding="10">
      <td>Username</td>
      <td>Filename</td>
   </tr>
{% for file in files %}
  <tr padding=10>
     <td padding=10> {{ file.username }} </td>
     <td padding=10> {{ file.title }} </td>
     <td><a href="{{ url_for('static', filename=file.file) }}">Download</a></td>
  </tr>
{% endfor %}
</table>

{{ pagination.info }}
{{ pagination.links }}

{% endblock %}

结果:

如您所见,pagination.info 正确显示了记录数,但它仍然显示每条记录,尽管变量 per_page 设置为 1。

【问题讨论】:

  • 你迭代文件而不是分页。
  • 你混淆了 Flask-SQLAlchemy 分页和 Flask-Paginate(给定示例中使用了最后一个)

标签: python flask pagination flask-sqlalchemy


【解决方案1】:

扩展 VKolev 的答案,您需要一个偏移量变量并将 per_page 和偏移量应用于查询。实际上有一个方便的 built-in 可以同时设置 page、per_page 和 offset,您可以使用 from flask_paginate import get_page_args 导入)。但是,在您的示例中,由于您需要与默认值不同的值,因此手动操作同样容易。完整的 view.py 代码如下所示:

from flask_paginate import Pagination, get_page_args

@search.route('/dashboard')
def dashboard():
    page = int(request.args.get('page', 1))
    per_page = 1
    offset = (page - 1) * per_page

    files = File.query.order_by(File.title)
    files_for_render = files.limit(per_page).offset(offset)

    search = False

    q = request.args.get('q')
    if q:
        search = True

    pagination = Pagination(page=page, per_page=per_page, offset=offset,
                           total=files.count(), css_framework='bootstrap3', 
                           search=search)

    return render_template('dashboard.html', files=files_for_render, pagination=pagination)

【讨论】:

    【解决方案2】:

    或者,如果您使用的是 Flask-SQLAlchemy,则已经有分页。只需在order_by() 之后添加.pagination()。更多信息请查看documentation

    Flask-Paginate 只是渲染分页,实际的分页是在 select 中完成的。所以你应该手动限制和偏移

    File.query.order_by(File.title).limit(per_page).offset(page*page_size)
    

    (这只是一个例子,不保证它会起作用)

    【讨论】:

      猜你喜欢
      • 2016-08-18
      • 2019-03-26
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      相关资源
      最近更新 更多