Как сделать переадресацию на первую страницу пагинации в Flask при применении фильтра?
Есть страничка с пагинацией по шаблону ./pagenumber/, всё работает. Но если перейти на последнюю страницу, а потом применить фильтр и в результате количество страниц уменьшится - возникает ситуация "нет записей". Хотя на первой странице они точно есть. Как идеологически правильно нужно сбрасывать номер страницы в данном случае?
Как вариант - это посмотреть как реализовано во flask admin и сделать так же. https://github.com/flask-admin/flask-admin/blob/ma...
Там тоже есть фильтры, но все корректно работает и нет таких ситуаций, которые вы описали.
pcdesign, посмотрел - там номер страницы передаётся через аргумент, а не путь в адресной строке как у меня. Мой случай:
1. /base - первая страница
2. /base/2 - вторая страница
3. /base/5 - последняя страница
4. /base/5?data=1 - включаем фильтр, данных меньше и на этой странице их нет
5. /base/1?data=1 - вернулись на первую, данные есть
Получается, мне нужно вместо шага 4 выдавать сразу шаг 5 - при применении фильтра менять ссылку. Возможно ли это в Flask или придётся перетаскивать номер страницы в "&page=1" ?
Dinxor, а без разницы через аргумент передавать page=5 или /page/5/ - это не имеет значения.
Мне кажется, что вы что-то не то делаете. Если в вашем приложении есть база данных, например sql, то используют flask sqlalchemy в которой пагинация работает из коробки. Если база монго, то используют, например, mongoengine, в которой тоже из коробки работает это дело и т.д. Никто не пишет пагинацию руками.
pcdesign, у меня как раз flask_sqlalchemy и роут через /int:page так что проблем с пагинацией не было до подключения фильтров. Согласен, может я что-то не так делаю но разница есть - page=5 исправить проще чем request.path в данном случае.
pcdesign, да, возвращаю что-то вроде render_template('base.html', base=base.paginate(page, 20), flt=flt) и всё вроде работает. Или правильнее будет какой-то другой подход?
pcdesign, не понял примера. По ссылке
class flask_sqlalchemy.BaseQuery(entities, session=None)
содержит метод
paginate(page=None, per_page=None, error_out=True, max_per_page=None)
Returns per_page items from page page.
Returns a Pagination object.
который возвращает объект класса
class flask_sqlalchemy.Pagination(query, page, per_page, total, items)
я вроде бы этим и пользуюсь?
pcdesign, да пагинация рендерится при отдаче страницы по уже отфильтрованным данным. Я применил костыль
if base.count() < per_page*(page-1):
page = 1
и отображается первая страница, но в адресной строке ещё висит старое значение. Также можно взводить отдельную переменную только при запросе страницы через фильтр, но на адресную строку это тоже не влияет. Вот и пытаюсь найти более грамотное решение.