Метод paginate
Метод paginate применяется к объекту запроса
query и возвращает объект пагинации
Pagination. Первым параметром передаётся
номер страницы page, вторым - количество
записей на странице per_page. Третьим
необязательным параметром передаётся error_out,
который определяет, выбрасывать ли ошибку 404 при
выходе за пределы диапазона страниц. Полученный
объект содержит список элементов страницы items,
номер текущей страницы page, общее число
страниц pages и другие атрибуты.
Синтаксис
query.paginate(page, per_page, [error_out])
Пример
Давайте создадим модель Article и выведем
вторую страницу по три записи на страницу:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
with app.app_context():
db.create_all()
for i in range(1, 8):
db.session.add(Article(title=f'article {i}'))
db.session.commit()
res = Article.query.paginate(page=2, per_page=3)
print(res.page)
print(res.pages)
print([a.title for a in res.items])
Результат выполнения кода:
2
3
['article 4', 'article 5', 'article 6']
Пример
Давайте выведем список статей с постраничной навигацией в шаблоне:
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
@app.route('/articles/<int:page>')
def articles(page):
pagination = Article.query.paginate(page=page, per_page=3)
return render_template('articles.html', pagination=pagination)
Теперь создадим шаблон:
{% for article in pagination.items %}
<p>{{ article.title }}</p>
{% endfor %}
<p>Страница {{ pagination.page }} из {{ pagination.pages }}</p>
{% if pagination.has_prev %}
<a href="/articles/{{ pagination.prev_num }}">Назад</a>
{% endif %}
{% if pagination.has_next %}
<a href="/articles/{{ pagination.next_num }}">Вперёд</a>
{% endif %}
Результат выполнения кода для адреса /articles/2:
<p>article 4</p>
<p>article 5</p>
<p>article 6</p>
<p>Страница 2 из 3</p>
<a href="/articles/1">Назад</a>
<a href="/articles/3">Вперёд</a>
Пример
Давайте отключим ошибку 404 при выходе за пределы диапазона страниц:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
with app.app_context():
res = Article.query.paginate(page=100, per_page=3, error_out=False)
print(res.items)
print(res.page)
Результат выполнения кода:
[]
100
Смотрите также
-
класс
SQLAlchemy,
который связывает Flask с базой данных -
метод
get_or_404,
который возвращает запись или ошибку 404 -
метод
first_or_404,
который возвращает первую запись или ошибку 404 -
атрибут
Model,
который является базовым классом моделей