web-dev-qa-db-fra.com

Python Flask Pagination SQLAlchemy

J'ai du mal à implémenter la pagination avec Flask-SQLAlchemy ou Flask-Pagination, soit ou. Je ne sais pas comment initialiser la pagination, définir des pages, déterminer des pages, offest, etc. Je viens de PHP, assez nouveau pour Python.

Je recherche tous les articles de ma base de données

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

J'ai regardé les exemples suivants:

Je ne sais vraiment pas quoi faire, les informations que je trouve diffèrent considérablement d'un article à l'autre. Cela m'a laissé avec confusion et ne sachant pas par où commencer. Je souhaite interroger toutes les lignes de la table de base de données, limiter les résultats à 20 et paginer. Je ne vois pas cela clairement.

12
user7731688

Je recommande d'utiliser la pagination de Flask-SQLAlchemy: http://flask-sqlalchemy.pocoo.org/2.1/api/?highlight=pagination#flask.ext.sqlalchemy.Pagination

Il y a un exemple bien écrit ici: https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-ix-pagination

Voici l'idée de base de la vue:

@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)

Et puis pour le modèle (je ne connais pas le modèle de vos posts donc j'ai inventé quelque chose):

<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

Manette

@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)

dans la vue

{% 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