@zummabox

Как выводить по несколько элементов с помощью пагинации aiogram3?

Подскажите пожалуйста, как выдавать пользователю сразу 5 товаров из БД ? На данный момент он выдает по 1 товару и чтобы посмотреть все, нужно каждый перелистывать, а так как в дальнейшем в боте будет очень много товаров, хотел сделать так, что бы за раз он отправлял по 5 товаров.
Пагинатор:
class Paginator:
def __init__(self, array: list | tuple, page: int=1, per_page: int=1):
    self.array = array
    self.per_page = per_page
    self.page = page
    self.len = len(self.array)
    # math.ceil - округление в большую сторону до целого числа
    self.pages = math.ceil(self.len / self.per_page)

def __get_slice(self):
    start = (self.page - 1) * self.per_page
    stop = start + self.per_page
    return self.array[start:stop]

def get_page(self):
    page_items = self.__get_slice()
    return page_items

def has_next(self):
    if self.page < self.pages:
        return self.page + 1
    return False

def has_previous(self):
    if self.page > 1:
        return self.page - 1
    return False

def get_next(self):
    if self.page < self.pages:
        self.page += 1
        return self.get_page()
    raise IndexError(f'Next page does not exist. Use has_next() to check before.')

def get_previous(self):
    if self.page > 1:
        self.page -= 1
        return self.__get_slice()
    raise IndexError(f'Previous page does not exist. Use has_previous() to check before.')

Работа с менюшкой:
async def main_menu(session, level, menu_name):
    banner = await orm_get_banner(session, menu_name)
    image = InputMediaPhoto(media=banner.image, caption=banner.description)

    kbds = get_user_main_btns(level=level)

    return image, kbds


async def catalog(session, level, menu_name):
    banner = await orm_get_banner(session, menu_name)
    image = InputMediaPhoto(media=banner.image, caption=banner.description)

    categories = await orm_get_categories(session)
    kbds = get_user_catalog_btns(level=level, categories=categories)

    return image, kbds


def pages(paginator: Paginator):
    btns = dict()
    if paginator.has_previous():
        btns[" Пред."] = "previous"

    if paginator.has_next():
        btns["След. "] = "next"

    return btns


async def products(session, level, category, page):
    products = await orm_get_products(session, category_id=category)

    paginator = Paginator(products, page=page, per_page=1)
    page_items = paginator.get_page()

    for product in page_items:
        image = InputMediaPhoto(
            media=product.image,
            caption=f"<strong>{product.name}\
                    </strong>\n{product.description}\nСтоимость: {round(product.price, 2)}\n\
                    <strong>Товар {paginator.page} из {paginator.pages}</strong>",
        )

    pagination_btns = pages(paginator)

    kbds = get_products_btns(
        level=level,
        category=category,
        page=page,
        pagination_btns=pagination_btns,
        #product_id=product.id,
    )

    return image, kbds


async def get_menu_content(
        session: AsyncSession,
        level: int,
        menu_name: str,
        category: int | None = None,
        page: int | None = None,
):

    if level == 0:
        return await main_menu(session, level, menu_name)
    elif level == 1:
        return await catalog(session, level, menu_name)
    elif level == 2:
        return await products(session, level, category, page)
  • Вопрос задан
  • 342 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы