Хочу сделать пагинацию - всё получалось, поместил информацию в список, разделил на равные части (страницы), но никак не могу придумать, как реализовать перелистывание страниц. Пытался сделать через передачу с callback, но потом не могу вызвать функцию для отправки сообщения и обновления кнопок. В ручную (меняя переменную current_page) - всё прекрасно работает!
r_json = reqtest.get_schools(449) # <-- JSON in List
buttons = InlineKeyboardMarkup()
chunk_size = 15
chunks = [r_json[i:i + chunk_size] for i in range(0, len(r_json), chunk_size)] # Делим все школы на группы (страницы) по 2
max_page = len(chunks)
current_page = int(db.get_current_page(message.from_user.id))
for a in chunks[current_page]:
buttons.add(InlineKeyboardButton(text=a['shortName'], callback_data=f"school-{a['id']}"))
buttons.add(InlineKeyboardButton(text='<', callback_data=f'to-left-{max_page}'), InlineKeyboardButton(text=f'{current_page + 1}/{max_page}', callback_data='count'), InlineKeyboardButton(text='>', callback_data=f'to-right-{max_page}'))
buttons.add(InlineKeyboardButton(text='Поменять город', callback_data='choose_city'))
await bot.send_message(message.from_user.id, f'Выберите школу:', reply_markup=buttons)
Пытался поймать callback стрелок, но коряво получилось:
@dp.callback_query_handler(lambda c: re.search('to-', c.data))
async def to_page(call: CallbackQuery):
chat_id = call.message.chat.id
await call.answer()
side_page = call.data.split("-")[1]
max_page = call.data.split("-")[2]
current_page = int(db.get_current_page(chat_id))
if side_page == 'left':
if current_page <= 0:
current_page = max_page
else:
current_page = current_page - 1
db.set_current_page(chat_id, current_page)