当前位置:   article > 正文

第十一章 博客文章(三)_pagination撖寡情

pagination撖寡情

一. Pagination类对象的属性及方法

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

Flask-SQLAlchemy分页对象的属性
属性说明
items当前页的记录
query分页的源查询(可打印此属性,查看原生的SQL语句)
page当前页的页数
prev_num上一页的页数
next_num下一页的页数
has_prev如果有上一页返回True
has_next如果有下一页返回True
pages查询得到的总页数
per_page每页显示的记录总量
tatal查询返回的记录总数
Flask-SQLAlchemy分页对象的方法
方法说明
iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2)一个迭代器,返回一个在分页导航中显示的页数列表。列入,在一个100页的列表中,当前页为第50页,使用默认配置,这个方法将返回以下页数:1,2,None,48,49,50,51,52,53,54,55,None,99,100
prev()上一页的分页对象
next()下一页的分页对象

二. 实现分页模板宏

借助Pagination分页对象和BootStrap中的分页CSS类,我们很轻易就能在模板底部构建一个分页导航。

app/templates/_macros.html:分页模板宏

  1. {% macro pagination_widget(pagination, endpoint) %}
  2. <ul class="pagination">
  3. <li{% if not pagination.has_prev %} class="disabled"{% endif %}>
  4. <a href="{% if pagination.has_prev %}{{ url_for(endpoint, page=pagination.prev_num, **kwargs) }}{% else %}#{% endif %}">
  5. &laquo;
  6. </a>
  7. </li>
  8. {% for p in pagination.iter_pages() %}
  9. {% if p %}
  10. {% if p == pagination.page %}
  11. <li class="active">
  12. <a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a>
  13. </li>
  14. {% else %}
  15. <li>
  16. <a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a>
  17. </li>
  18. {% endif %}
  19. {% else %}
  20. <li class="disabled"><a href="#">&hellip;</a></li>
  21. {% endif %}
  22. {% endfor %}
  23. <li{% if not pagination.has_next %} class="disabled"{% endif %}>
  24. <a href="{% if pagination.has_next %}{{ url_for(endpoint, page=pagination.next_num, **kwargs) }}{% else %}#{% endif %}">
  25. &raquo;
  26. </a>
  27. </li>
  28. </ul>
  29. {% endmacro %}

这个宏创建了一个BootStrap分页元素,即一个有特殊样式的分页列表,此页面元素包含三部分:

  • “上一页”链接。如果当前页是第一页,则这个元素需要加上disabled类;若存在上一页,则使用url_for生成上一页的href;
  •  遍历iter_pages()迭代器时,首先需要判断页数是否为None,为None时渲染...;不为None时,继续判断是否为当前页,并将当前页使用active CSS类高亮显示;
  • “下一页链接”。如果当前页已是最后一页,则会禁用这个链接;

注意:创建页面链接时使用“{{ url_for(endpoint, page = p, **kwargs) }}”,而宏{% macro pagination_widget(pagination, endpoint) %}定义时并没有定义**kwargs。那是因为Jinja2 宏的参数列表中不用加入 **kwargs 即可接收关键字参数。

此处分页宏把所接收到的所有关键字参数都传给了生成分页链接的url_for()方法。这样做是为了增加灵活性和通用性,因为资料页面的路由不仅需要page查询参数,还包含动态路由的参数。

三. 在首页和资料页添加分页导航

pagination_widget 宏可放在 index.html user.html 中的 _posts.html 模板后面。

app/templates/index.html:在博客文章列表下面添加分页导航

  1. {% import "_macros.html" as macros %}
  2. ...
  3. {% if pagination %}
  4. <div class="pagination">
  5. {{ macros.pagination_widget(pagination, '.index') }}
  6. </div>
  7. {% endif %}

app/templates/user.html资料页使用同样的方式添加博客分页导航。

运行结果:

详情页只显示自己发布的博客文章:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/613281
推荐阅读
相关标签
  

闽ICP备14008679号