【问题标题】:Python Flask SQLAlchemy PaginationPython Flask SQLAlchemy 分页
【发布时间】:2017-08-23 12:51:31
【问题描述】:

我在使用 Flask-SQLAlchemy 或 Flask-Pagination 实现分页时遇到问题。我不确定如何初始化分页、设置页面、确定页面、offest 等。我来自 PHP,对 Python 还很陌生。

我正在查询我数据库中的所有帖子

posts = Posts.query.order_by(Posts.time.desc()).all()

我一直在查看以下示例:

我真的不知道该怎么做,我发现的信息在文章之间有很大差异。这让我感到困惑,不知道从哪里开始。我想查询数据库表的所有行,将结果限制为 20 并分页。我没看清楚。

【问题讨论】:

    标签: python flask sqlalchemy flask-sqlalchemy flask-wtforms


    【解决方案1】:

    我推荐使用 Flask-SQLAlchemy 的分页:http://flask-sqlalchemy.pocoo.org/2.1/api/?highlight=pagination#flask.ext.sqlalchemy.Pagination

    这里有一个写得很好的例子:https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ix-pagination

    这是视图的基本思想:

    @app.route('/myview/<int:page>',methods=['GET'])
    def view(page=1):
        per_page = 10
        posts = Posts.query.order_by(Posts.time.desc()).paginate(page,per_page,error_out=False)
        return render_template('view.html',posts=posts)
    

    然后是模板(我不知道你的帖子模型,所以我做了一些东西):

    <html>
      <head>
        Posts
      </head>
      <body>
    
    {% for post in posts.items %}
    <p>
      {{ post.post_name }} post body: <b>{{ post.body }}</b>
    </p>
    {% endfor %}
    {% if posts.has_prev %}<a href="{{ url_for('view', page=posts.prev_num) }}">&lt;&lt; Newer posts</a>{% else %}&lt;&lt; Newer posts{% endif %} | 
    {% if posts.has_next %}<a href="{{ url_for('view', page=posts.next_num) }}">Older posts &gt;&gt;</a>{% else %}Older posts &gt;&gt;{% endif %}
    
      </body>
    </html>
    

    【讨论】:

    • 需要小改动 - @app.route('/myview/', methods=['GET'], defaults={"page": 1}) @app.route('/myview/ ',methods=['GET']) def view(page):
    • 如何接受排序列名和顺序(asc/desc)作为查询参数?我的 UI 视图在每个列标题上都有控件,以允许对该列进行升序或降序排序。对分页结果有很大影响:)
    • @chrisinmtown:可能值得自己提出问题!或者你可以看看已经有很多关于这个的问题!这是一个:stackoverflow.com/questions/24892035/…
    • 抱歉,措辞不佳。应该写“如何将排序列和顺序(asc/desc)字符串从查询参数传递给 order_by() 方法?”
    • @chrisinmtown:哦,我真的不认为该方法接受这个参数。您可以处理 if 块。例如,if args.sort_order == 'desc': # do something here,你就明白了。
    【解决方案2】:

    控制器

    @app.route('/', methods=['GET'], defaults={"page": 1}) 
    @app.route('/<int:page>', methods=['GET'])
    def index(page):
        page = page
        per_page = 2
        users = User.query.paginate(page,per_page,error_out=False)
        # print("Result......", users)
        return render_template("index.html", users=users)
    

    在视图中

    {% for user in users.items %}
        <h1> {{ user.name }} </h1>
    {% endfor %}
    
    <nav aria-label="Page navigation example">
                    <ul class="pagination">
                        {% if users.has_prev %}
                          <li class="page-item"> <a class="page-link" href="{{ url_for('index', page=users.prev_num) }}">Previous</a></li>
                        {% else %}
                          <li class="page-item"><a class="page-link btn disabled" href="#">Previous</a></li>
                        {% endif %}
    
    
                        {% if users.has_next %}
                          <li class="page-item"> <a class="page-link" href="{{ url_for('index', page=users.next_num) }}">Next</a></li>
                        {% else %}
                          <li class="page-item"><a class="page-link btn disabled" href="#">Next</a></li>
                        {% endif %}
    
                    </ul>
                  </nav>
    

    【讨论】:

      【解决方案3】:

      这是在烧瓶中添加分页的最简单答案

      no_of_posts = 3
      page = request.args.get("number")
          if page is None:
              page = 1
          else:
              page = int(page)
          allPosts = Posts.query.filter_by().all()
          length = len(allPosts)
          allPosts = allPosts[(page-1)*no_of_posts: page*no_of_posts]
          if page > 1:
              prev = page -1
          else:
              prev = None
          if page < math.ceil(length/no_of_posts):
              next = page + 1
          else:
              next = None
      

      在模板中

      {% if prev %}
      <a href="?number={{ prev }}">&laquo; Previous</a>
      {% endif %}
      {% if next %}
      <a href="?number={{ next }}">Next &raquo;</a>
      {% endif %}
      

      【讨论】:

      • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 2013-08-30
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多