Подскажите пожалуйста, как выдавать пользователю сразу 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)