返回介绍

分页导航

发布于 2025-01-02 21:53:52 字数 2696 浏览 0 评论 0 收藏

接下来的改变是在用户动态列表的底部添加链接,允许用户导航到下一页或上一页。 还记得我曾提到过 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_urlprev_url 只有在该方向上存在一个页面时,才会被设置为由 url_for() 返回的 URL。 如果当前页面位于用户动态集合的末尾或者开头,那么 Pagination 实例的 has_nexthas_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 ,则通过条件过滤将其从页面中省略。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。