利用Flask-SQLAlchemy提供的paginate()方法实现博客文章的分页显示
在开发blog系统的时候,我们有一个需求,就是要显示作者已经发表的blog文章的列表,或显示作者关注者的文章列表。实现这个功能并不复杂,只需要在存储文章的数据库中过滤出指定作者的文章,然后渲染HTML显示即可。
但是,这种方法在文章不多的情况下或许是可行的,当文章的数量变多的时候,就无法在一页中显示完所有的文章了。这时就需要将文章列表进行分页显示,每一页只显示指定数量的文章。
这个功能应该如何实现呢?我们能想到的一个直观的方法就是将从数据库中过滤得到的文章列表进行分组,每次只显示一组文章。然后根据用户的需要来显示指定组的文章列表。
俗话说:Talk is cheap ,show me the code .以上这些该如何落实到代码中呢?Flask-SQLAlchemy可以祝我们一臂之力。Flask-SQLAlchemy提供的paginate()方法可以实现按照指定的数量来对从数据库中得到的文章列表进行分组。那么有了文章列表的分组,我们该如何指定显示哪个分组呢?这就需要在HTML页面中添加一个分页导航栏了,有了这个分页导航栏,用户就可以根据需要显示指定的文章列表分组了。那么这个分页导航栏又该如何实现呢?让我们还是回到Flask-SQLAlchemy提供的paginate()方法中来,paginate()方法的返回值是一个Pagination类对象,这个类在Flask-SQLAlchemy中定义。这个类包含很多的属性,可以用来在模板中生成分页的链接,因此可以将其作为参数传入模板。
Pagination类对象的属性主要有:
has_next:如果在目前页后至少还有一页的话,返回 True。
has_prev:如果在目前页之前至少还有一页的话,返回 True。
next_num:下一页的页面数。
prev_num:前一页的页面数。
另外还有如下的可调用方法:
iter_pages():一个迭代器,返回一个在分页导航中显示的页数列表。
prev():上一页的分页对象。
next():下一页的分页对象。
关于Pagination类对象的属性和方法的详细介绍,
请参考
下面让我们先看一看如何将过滤得到的文章列表进行分组。
假设我们的文章存储在post表中,在ORM中的名字是Post。 @main.route('/', methods=['GET', 'POST'])
def index():
page = request.args.get('page', 1, type=int)
pagination = Post.query.order_by(Post.timestamp.desc()).paginate(page,per_page=current_app.config['ARTISAN_POSTS_PER_PAGE'],error_out=False)
posts = pagination.items
return render_template('index.html', form=form, posts=posts, pagination=pagination) 在Bootstrap中有分页的css类,我们可以利用这个类在模板中构建分页导航,利用jinjia2宏的形式实现的分页导航代码如下: <ul class="posts">
{% for post in posts %}
<li class="post">
<div class="post-thumbnail">
<a href="{{ url_for('.user', username=post.author.username) }}">
<img class="img-rounded profile-thumbnail" src="{{ post.author.image }}">
</a>
</div>
<div class="post-content">
<div class="post-date">{{ moment(post.timestamp).fromNow() }}</div>
<div class="post-author"><a href="{{ url_for('.user', username=post.author.username) }}">{{ post.author.username }}</a></div>
<div class="post-body">
{% if post.body_html %}
{{ post.body_html | safe }}
{% else %}
{{ post.body }}
{% endif %}
</div>
<div class="post-footer">
{% if current_user == post.author %}
<a href="{{ url_for('.edit',id=post.id)}}">
<span class="label label-primary">Edit</span>
</a>
{% elif current_user.is_adminstrator() %}
<a href="{{ url_for('.edit',id=post.id)}}">
<span class="label label-primary">Edit [Admin]</span>
</a>
{% endif %}
<a href="{{ url_for('.post',id=post.id) }}">
<span class="label label-default">Permalink</span>
</a>
</div>
</div>
</li>
{% endfor %}
</ul> 在主页中显示导航栏的代码如下:、 <div class="pagination">
{{ macros.pagination_widget(pagination, '.index') }}
</div>
利用Flask-SQLAlchemy提供的paginate()方法实现博客文章的分页显示的更多相关文章
- 利用爬虫爬取指定用户的CSDN博客文章转为md格式,目的是完成博客迁移博文到Hexo等静态博客
文章目录 功能 爬取的方式: 设置生成的md文件命名规则: 设置md文件的头部信息 是否显示csdn中的锚点"文章目录"字样,以及下面具体的锚点 默认false(因为csdn中是集 ...
- 如何利用 Open Live Writer 在本地发布WordPress博客文章
[导读] Open Live Writer是由Windows Live WriterWriter更名而来,是由微软推出的一款能够免费使用的博客写作软件. Open Live Writer 可以支持大多 ...
- 使用SQLAlchemy对博客文章进行分页
https://blog.csdn.net/hyman_c/article/details/54382161
- Flask 学习 十 博客文章
提交和显示博客文章 app/models.py 文章模型 class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer ...
- 用 Flask 来写个轻博客 (22) — 实现博客文章的添加和编辑页面
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 新建表单 新建视图函数 新建模板 在博客文章页面添加 New 和 Ed ...
- Python 2.7_爬取CSDN单页面利用正则提取博客文章及url_20170114
年前有点忙,没来的及更博,最近看爬虫正则的部分 巩固下 1.爬取的单页面:http://blog.csdn.net/column/details/why-bug.html 2.过程 解析url获得网站 ...
- 利用爬虫将Yuan先生的博客文章爬取下来
由于一次巧遇,我阅读了Yuan先生的一篇博客文章,感觉从Yuan先生得博客学到很多东西,很喜欢他得文章.于是我就关注了他,并且想阅读更多出自他手笔得博客文章,无奈,可能Yuan先生不想公开自己得博客吧 ...
- 利用Github和Hexo搭建独立的个人博客--基础篇
利用Github和Hexo搭建独立的个人博客--基础篇 摘要:本文主要参考了使用hexo和Github上创建自己的博客.如何搭建一个独立博客--简明Github Pages与Hexo教程和使用GitH ...
- SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET
SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET SAE利用storge上传文件
随机推荐
- 【撸码caffe四】 solver.cpp&&sgd_solver.cpp
caffe中solver的作用就是交替低啊用前向(forward)算法和后向(backward)算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法. solver.cpp中的Solver ...
- 纯CSS 实现关闭图标 icon
本文介绍关闭 icon 的实现.具体如下 1.html部分 <span id="close"></span> 2.css部分 #close { displa ...
- vs2010永久删除项目的相关操作
1.选中要删除的项目,在解决方案资源管理器中,直接左键点击一下即可.. 2.点击键盘的删除键“DElect”. 3.然后找到工程的目录后,删除项目.即可永久性删除不在需要的程序或者是项目.
- 从0开始学习BFC
为什么需要BFC? <style> .red { background: red; } .blue { background: #1890ff; } .green { background ...
- golang struct里面的字段,或者slice排序
accounts := []users.Account{}Admin.DB.Preload("CurrencyObj").Where("member_id = ?&quo ...
- itext 生成doc文档 小结(自己备忘)
1.引入maven <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</ ...
- 解决emlog默认导航不能修改的问题以及修改后台登录地址的方法
修改默认导航 我们需要使用修改代码的方式来解决 首先找到admin/navbar.php文件 然后找到需要删除的几行代码: if ($type != Navi_Model::navitype_cust ...
- 阶乘问题-----sum随变量改变而改变
- 【原创】你知道Oracle 10G能存多少数据吗
昨天晚上在看Oracle 10G联机文档中关于bigfile tablespaces的描述(引用1),发现了关于Oracle存储极限的简单描述.bigfile tablespaces的存在,让Orac ...
- javascript 基础知识点
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示 Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时 ...