Python 带分页的独立柱布线-烧瓶

Python 带分页的独立柱布线-烧瓶,python,pagination,flask,sqlalchemy,flask-sqlalchemy,Python,Pagination,Flask,Sqlalchemy,Flask Sqlalchemy,目标:发送到一篇文章/博客文章,并包括分页(使用SQL Alchemy),以便用户可以轻松导航到以前和将来的文章 目前,我有以下几点: @app.route('/articles/ind/<int:id>', endpoint='article') def indarticle(id = 1): posts= Post.query.paginate(id, 1, False) return render_template('article.html',

目标:发送到一篇文章/博客文章,并包括分页(使用SQL Alchemy),以便用户可以轻松导航到以前和将来的文章

目前,我有以下几点:

@app.route('/articles/ind/<int:id>', endpoint='article')
def indarticle(id = 1):
    posts= Post.query.paginate(id, 1, False)
    return render_template('article.html',
        title = "Article",
        posts = posts)

这样,我可以得到下一篇文章,上一篇文章,也可以很容易地检查它们是否存在,就像Alchemy如何处理分页一样。

为了确保我们讨论的是同一件事,分页有两种类型

首先,烧瓶支撑的那种。。。。调用所有文章并显示每页X篇文章

第二,你在一个岗位上,想要前进和后退

听起来你想做第二种

我所做的是在我的帖子模型中编写两个staticmethods,计算出上一篇和下一篇帖子。。。然后,我通过查看函数将值传递给模板

模型后静态方法

型号

@staticmethod
def prev_post(pid):
    count = Post.get_count()
    while (count > 0):
        prev_post = None
        pid = pid - 1
        if db.session.query(Post).get(pid) is not None:
            prev_post = db.session.query(Post).get(pid)
            break
        else:
            count = count - 1
    return prev_post

@staticmethod
def next_post(pid):
    count = Post.get_count()
    while (count > 0):
        next_post = None
        pid = pid + 1
        if db.session.query(Post).get(pid) is not None:
            next_post = db.session.query(Post).get(pid)
            break
        else:
            count = count - 1
    return next_post
prev_post功能的工作原理

  • 使用post计数设置我的while循环的范围
  • 在prev_post的情况下,指定一个None值,以便在没有找到任何先前的内容时,模板逻辑工作。此外,如果未分配任何对象,并且您尝试在视图中传递,则会出现错误
  • 对于prev_post,在每个循环过程中,从pid中减去1,并检查db中是否存在条目
  • 迭代循环,每次减去1
  • 第一次找到匹配项时,中断循环并用post.id替换prev_post none值
  • 当然,下一个函数是完全相同的,只是您将pid加1,而不是-1

    这就解决了删除帖子和显示错误号码的问题。另外,请注意,我不必返回所有帖子并循环浏览它们。我只是简单地得到一个计数,然后一次检查一个pid是否存在。我很少需要经历超过2或3个循环才能获得成功,因为循环总是相对于当前帖子开始的。简而言之,此过程使用的内存相对较少

    现在我可以在我的视图中调用这些函数

    查看

    @app.route('/<path:url>', methods=['GET', 'POST']) def
    display_post(url):
        post = Post.get_post(url)
        next_post = Post.next_post(post.id)
        prev_post = Post.prev_post(post.id)
        return render_template('post.html',
                               next=next_post, prev=prev_post, post=post)
    
    @app.route('/',methods=['GET','POST'])def
    显示帖子(url):
    post=post.get\u post(url)
    下一个职位=职位。下一个职位(职位id)
    上一篇文章=上一篇文章(文章id)
    返回呈现模板('post.html',
    下一个=下一个职位,上一个=上一个职位,职位=职位)
    
    这是模板

    模板

    {% extends "base.html" %}
    {% block title %}{{ post.title }}{% endblock %}
    {% block content %}
    <H2>{{ post.title }}</H2>
    <b>Posted {{ post.pub_date|dts }} in <a href="{{ url_for('display_topic', url=post.topic.url) }}">{{post.topic}}</a></b>
    {{post.body|markdown}}
    {% if prev.url is defined %}
    <a href="{{ url_for('display_post', url=prev.url) }}"><<< {{prev.title}}</a>
    {% endif %}
    {% if prev.url is not defined and next.url is not defined %}{% else %} | {% endif %}
    {% if next.url is defined %}
    <a href="{{ url_for('display_post', url=next.url) }}">{{next.title}} >>></a>
    {% endif %}
    {% if current_user.is_authenticated() %}
    <p><a href="{{ url_for('edit_post', url=post.url) }}">edit</a></p>
    <p><a href="{{ url_for('delete_post', url=post.url) }}">delete</a></p>
    {% endif %}
    {% endblock %}
    
    {%extends“base.html”%}
    {%block title%}{{post.title}{%endblock%}
    {%block content%}
    {{post.title}}
    在中发布{post.pub_date}dts}
    {{post.body | markdown}}
    {%如果定义了prev.url%}
    {%endif%}
    {%如果当前用户是经过身份验证的用户。{u()%}
    

    {%endif%} {%endblock%}

    模板仅在存在下一篇或上一篇文章时显示链接。

    我喜欢这个策略;不过,我对它做了一些更改/升级,使它更像flask sqlalchemy中的分页功能!将很快发布!酷。请查看**if db.session.query(Post.get)(pid)不是None:*行。它们可能会得到改进。同时,如果您认为问题得到了恰当的回答,请关闭该问题。您可以稍后更新您的回复。
    {% extends "base.html" %}
    {% block title %}{{ post.title }}{% endblock %}
    {% block content %}
    <H2>{{ post.title }}</H2>
    <b>Posted {{ post.pub_date|dts }} in <a href="{{ url_for('display_topic', url=post.topic.url) }}">{{post.topic}}</a></b>
    {{post.body|markdown}}
    {% if prev.url is defined %}
    <a href="{{ url_for('display_post', url=prev.url) }}"><<< {{prev.title}}</a>
    {% endif %}
    {% if prev.url is not defined and next.url is not defined %}{% else %} | {% endif %}
    {% if next.url is defined %}
    <a href="{{ url_for('display_post', url=next.url) }}">{{next.title}} >>></a>
    {% endif %}
    {% if current_user.is_authenticated() %}
    <p><a href="{{ url_for('edit_post', url=post.url) }}">edit</a></p>
    <p><a href="{{ url_for('delete_post', url=post.url) }}">delete</a></p>
    {% endif %}
    {% endblock %}