Coder Social home page Coder Social logo

paginate_flask's Introduction

Проект создан чтобы показать как работает пагинация постов на фреймворке flask

Формируем get запрос с ключом page, стартовой страницей 1 и типом данных integer Формат запроса в строке браузера: ?page=1

page = request.args.get('page', 1, type=int)

Flask-SQLAlchemy дает нам хороший инструмент для разбиения больших списков на страницы метод paginate вызывается на любом Query объекте. В данном примере это объект posts

Принимает аргументы: page - номер текущей страницы, 1 по умолчанию per_page - количество элементов (постов) на странице

posts = Post.query.paginate(page=page, per_page=20)

То есть, на каждом page+1 будет выводиться 20 элементов

Для примера генерирую сотню статей циклом for, используя базу sqlite3 for i in range(1, 101): post = Post(title=f'New post', content=f'Я создан автоматически, мой номер {i}') db.session.add(post) db.session.commit()

Если в базе уже есть сотня страниц, добавление в базу прекращается. За это отвечает условие:

if not posts.total >= 100:
    не добавлять статьи если уже есть сотня в базе
    метод total считает количество объектов в posts

В файле index.html с помощью шаблонизатора Jinja items - элементы текущей страницы проходим циклом и выводим элементы текущей страницы из объекта paginate

    {% for post in posts.items %}
  • {{ post.title }} - {{ post.content }}
  • {% endfor %}

итерируемся в цикле по объекту paginate

 {% for page in posts.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}

iter_pages итерирует по номерам страниц в нумерации страниц. Четыре параметра контролируют пороговые значения того, сколько элементов (кнопок для навигации) должно быть произведено по сторонам. Номера пропущенных страниц отображаются как None.

{% if posts.page == page %}

Если posts.page = 4 и если page равно 4 то True

print(posts.page) # 4
print(page) # 4
print(posts.page == page) True

Показываем страницу page=4 с её 20-ю постами (20 указано в per_page=20) Находимся на текущей странице, иначе можем сделать переход на другие страницы, согласно пороговым значениям итератора left_edge=1, right_edge=1, left_current=1, right_current=2

Страницы, уходящие за границы помечаются как None и на данном примере выводятся как ... троеточие

Установленные пакеты:

flask flask-sqlalchemy

Установка зависимостей:

pip install -r req.txt

Ссылка на пост ВК https://vk.com/python_for_me?w=wall-184890296_579%2Fall

Михаил Терехов ака MikedoIT 2021

paginate_flask's People

Contributors

mikesoweb avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.