当前位置:   article > 正文

关于flask入门教程-图书借阅系统-分页显示数据

flask 分页模板

 在做网页的过程中,随着展示的数据增多,如果要在一页中显示全部内容,浏览速度会变慢且不符合实际需求。在 Web 浏览器中, 内容多的网页需要花费更多的时间生成、下载和渲染, 所以网页内容变多会降低用户体验的质量。这一问题的解决方法是分页 显示数据,进行片段式渲染。

flask进行分页显示数据提供了两种方法,一种是Flask-SQLAlchemy 的Pagination对象,一种是flask_paginate包,其实两者是高度一致的,flask_paginate是直接将Pagination和BootStrap做了绑定,但其实效果不是很好,估计是CSS之间有冲突。

其他方法则是自己定制代码实现分页。

paginate() 方法的返回值是一个 Pagination 类对象,这个类在 Flask-SQLAlchemy 中定义。这个对象包含很多属性, 用于在模板中生成分页链接,因此将其作为参数传入了模板。

  1. @app.route('/index/')
  2. def indexv5():
  3. page = int(request.args.get('page', 1))
  4. per_page = int(request.args.get('per_page', 5))
  5. paginate = BookInfo.query.order_by('isbnno').paginate(page, per_page, error_out=False)
  6. pagedata = paginate.items
  7. return render_template('indexv5.html',paginate=paginate, pagedata=pagedata)

html页面代码如下:

  1. {% extends 'base.html' %}
  2. {% block content %}
  3. <div class="panel panel-default">
  4.   <!-- Default panel contents -->
  5.   <div class="panel-heading"><center><h2>Flask 图书馆图书列表</h2></center></div>
  6.   <div class="panel-body">
  7.     <!--p>Flask 图书馆图书列表子标题</p-->
  8.   </div>
  9.          <table class="table table-striped" style="color: black">
  10.       <!--caption><center><h2>Flask 图书馆图书列表</h2></center></caption-->
  11.       <thead>
  12.       </thead>
  13.       <tbody>
  14.             {% for book in pagedata %}
  15.                <tr>
  16.                 <td>{{ book.isbnno }}</th>
  17.                 <td>{{ book.bookname }}</td>
  18.                 <td>{{ book.publisher }}</td>
  19.                 <td>{{ book.publicationdate }}</td>
  20.                 <td>{{ book.booktype }}</td>
  21.                 <td>{{ book.stockdate }}</td>
  22.                </tr>
  23.             {% endfor %}
  24.       </tbody>
  25.      </table>       
  26. </div>       
  27.       <div>
  28.         <center>
  29.             当前页数:{{ paginate.page }}
  30.         总页数:{{ paginate.pages }}
  31.         一共有{{ paginate.total }}条数据
  32.             <ul class="pagination pagination-lg">
  33.             {% if paginate.has_prev %}
  34.                     <li><a href="/index/?page={{ paginate.prev_num }}">上一页</a></li>
  35.             {% endif %}
  36.             {% for i in paginate.iter_pages() %}
  37.                     <li><a href="/index/?page={{ i }}">{{ i }}</a></li>
  38.             {% endfor %}
  39.             {% if paginate.has_next %}
  40.                     <li><a href="/index/?page={{ paginate.next_num }}">下一页</a></li>
  41.             {% endif %} 
  42.             </ul>
  43.         </center>
  44.          </div>
  45. {% endblock %}

最后展示效果:

087eb2ccf94ea56877662c2e347d5bec.png

flask_paginate也可以直接使用,代码就不做详细解读了

  1. from flask_paginate import Pagination, get_page_parameter
  2. PER_PAGE =5
  3. @app.route('/index/')
  4. def index():
  5. search = False
  6. q = request.args.get('q')
  7. if q:
  8. search = True
  9. page = request.args.get(get_page_parameter(), type=int, default=1)
  10. start = (page - 1) * PER_PAGE
  11. end = start + PER_PAGE
  12. total = BookInfo.query.order_by('isbnno').count()
  13. books = BookInfo.query.order_by('isbnno').slice(start, end)
  14. pagination = Pagination(page=page, per_page=PER_PAGE,total=total, search=search, record_name='books')
  15. return render_template('indexv6.html',
  16. books=books,
  17. pagination=pagination,
  18. )

相关页面代码如下,要比上面简洁一些。

  1. {% extends 'base.html' %}
  2. {% block content %}
  3. <table class="uk-table uk-table-striped">
  4.     <thead>
  5.         <tr>
  6.             <th>序号</th>
  7.             <th>ISBNNO</th>
  8.             <th>书籍名称</th>
  9.             <th>出版社</th>
  10.             <th>出版时间</th>
  11.             <th>文献类型</th>
  12.             <th>入库时间</th>
  13.         </tr>
  14.     </thead>
  15.     <tbody>
  16.         {% for book in books %}
  17.                <tr>
  18.                 <td>{{ loop.index + pagination.skip }}</td>
  19.                 <td>{{ book.isbnno }}</td>
  20.                 <td>{{ book.bookname }}</td>
  21.                 <td>{{ book.publisher }}</td>
  22.                 <td>{{ book.publicationdate }}</td>
  23.                 <td>{{ book.booktype }}</td>
  24.                 <td>{{ book.stockdate }}</td>
  25.                </tr>
  26.             {% endfor %}
  27.     </tbody>
  28. </table>
  29.     {{ pagination.links }}
  30. {% endblock %}

运行后输出的静态html页面,很明显直接输出了bootstrap的标签,引用的bootstrap样式。

  1. <div class="pagination">
  2.         <ul>
  3.                 <li class="previous"><a href="/index/">&laquo;</a></li>
  4.                 <li><a href="/index/">1</a></li>
  5.                 <li class="active"><a>2</a></li>
  6.                 <li><a href="/index/?page=3">3</a></li>
  7.                 <li><a href="/index/?page=4">4</a></li>
  8.                 <li><a href="/index/?page=5">5</a></li>
  9.                 <li class="next"><a href="/index/?page=3">&raquo;</a></li>
  10.         </ul>
  11. </div>

展现结果如下,效果不是很理想,推荐使用第一种。

6e06ed41aa179acb45e7e9365ccd5286.png

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/788259
推荐阅读
相关标签
  

闽ICP备14008679号