文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
分页导航
接下来的改变是在用户动态列表的底部添加链接,允许用户导航到下一页或上一页。 还记得我曾提到过 paginate()
的返回是 Pagination
类的实例吗? 到目前为止,我已经使用了此对象的 items
属性,其中包含为所选页面检索的用户动态列表。 但是这个分页对象还有一些其他的属性在构建分页链接时很有用:
has_next
: 当前页之后存在后续页面时为真has_prev
: 当前页之前存在前置页面时为真next_num
: 下一页的页码prev_num
: 上一页的页码
有了这四个元素,我就可以生成上一页和下一页的链接并将其传入模板以渲染:
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
@login_required
def index():
# ...
page = request.args.get('page', 1, type=int)
posts = current_user.followed_posts().paginate(
page, app.config['POSTS_PER_PAGE'], False)
next_url = url_for('index', page=posts.next_num) \
if posts.has_next else None
prev_url = url_for('index', page=posts.prev_num) \
if posts.has_prev else None
return render_template('index.html', title='Home', form=form,
posts=posts.items, next_url=next_url,
prev_url=prev_url)
@app.route('/explore')
@login_required
def explore():
page = request.args.get('page', 1, type=int)
posts = Post.query.order_by(Post.timestamp.desc()).paginate(
page, app.config['POSTS_PER_PAGE'], False)
next_url = url_for('explore', page=posts.next_num) \
if posts.has_next else None
prev_url = url_for('explore', page=posts.prev_num) \
if posts.has_prev else None
return render_template("index.html", title='Explore', posts=posts.items,
next_url=next_url, prev_url=prev_url)
这两个视图函数中的 next_url
和 prev_url
只有在该方向上存在一个页面时,才会被设置为由 url_for()
返回的 URL。 如果当前页面位于用户动态集合的末尾或者开头,那么 Pagination
实例的 has_next
或 has_prev
属性将为'False',在这种情况下,将设置该方向的链接为 None
。
url_for()
函数的一个有趣的地方是,你可以添加任何关键字参数,如果这些参数的名字没有直接在 URL 中匹配使用,那么 Flask 将它们设置为 URL 的查询字符串参数。
现在让我们把它们渲染在 index.html 模板上,就在用户动态列表的正下方:
...
{% for post in posts %}
{% include '_post.html' %}
{% endfor %}
{% if prev_url %}
<a href="{{ prev_url }}">Newer posts</a>
{% endif %}
{% if next_url %}
<a href="{{ next_url }}">Older posts</a>
{% endif %}
...
主页和发现页都添加了分页链接。第一个链接标记为“Newer posts”,并指向前一页(请记住,我显示的用户动态按时间的倒序来排序,所以第一页是最新的内容)。 第二个链接标记为“Older posts”,并指向下一页的帖子。 如果这两个链接中的任何一个都是 None
,则通过条件过滤将其从页面中省略。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论