web-dev-qa-db-ja.com

Python Flask SQLAlchemyページネーション

Flask-SQLAlchemyまたはFlask-Paginationのいずれかでページネーションを実装するのに問題があります。ページネーションを初期化する方法、ページを設定する方法、ページを決定する方法、offestなどがわかりません。私はPHPから来ており、Pythonにはまったく新しいです。

データベース内のすべての投稿を照会しています

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

私は次の例を見てきました:

私は本当に何をすべきか混乱しています。私が見つけている情報は記事によって大きく異なります。混乱し、どこから始めればよいか分からないままになりました。データベーステーブルのすべての行をクエリし、結果を20に制限してページ分割します。私はこれをはっきりと見ていません。

12
user7731688

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>
25
bernie

コントローラ

@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>
1
user3186184