📖 Пагинация¶
Нужно пролистать длинный список элементов?
В Raito есть встроенная пагинация для inline, текста, фото, списков и rich-сообщений: простая и полностью настраиваемая.
Возможности¶
готовые типы пагинаторов (inline, text, photo, list, rich)
автоматическая навигация
зацикленная навигация (переход с последней страницы на первую и обратно)
декларативный хендлер через
@rt.on_pagination(...)гибкий API и подключаемые типы пагинаторов
Быстрый старт¶
1. Запуск пагинации¶
@router.message(filters.CommandStart())
async def start(message: Message, raito: Raito, bot: Bot) -> None:
if not message.from_user:
return
await raito.paginate(
"my_pagination_name",
chat_id=message.chat.id,
bot=bot,
from_user=message.from_user,
total_pages=10,
limit=5,
)
2. Обработка событий пагинации¶
Чтобы реагировать на смену страниц, используйте декоратор @rt.on_pagination(...):
@rt.on_pagination(router, "my_pagination_name")
async def on_pagination(
query: CallbackQuery,
paginator: InlinePaginator,
offset: int,
limit: int,
):
buttons = [InlineKeyboardButton(text=str(i), callback_data=f"button_{i}") for i in range(offset, offset + limit)]
await paginator.answer("Button list:", buttons=buttons)
Типы пагинаторов¶
Выберите пагинатор через mode= (по умолчанию PaginationMode.INLINE):
PaginationMode.INLINE:InlinePaginator, текст плюс ряд кнопок с контентом над навигацией.PaginationMode.TEXT:TextPaginator, простой текст.PaginationMode.PHOTO:PhotoPaginator, фото с подписью.PaginationMode.LIST:ListPaginator, список строк, соединённых разделителем.PaginationMode.RICH:RichPaginator, структурированные rich-сообщения: заголовки, списки, таблицы, блоки кода и не только. Требуетaiogram>=3.30.0.
await raito.paginate(
"rich_docs",
chat_id=message.chat.id,
bot=bot,
from_user=message.from_user,
mode=PaginationMode.RICH,
total_pages=3,
)
@rt.on_pagination(router, "rich_docs")
async def on_rich_pagination(query: CallbackQuery, paginator: RichPaginator, page: int) -> None:
await paginator.answer(rich_message=InputRichMessage(blocks=PAGES[page]))
Как это устроено¶
Все колбэки используют формат
rt_p:mode:name:page:total:limit- PaginatorMiddleware разбирает данные и передаёт:
paginator,offset,limit,page
Всё типобезопасно и построено на протоколе
IPaginatorМожно написать свои пагинаторы и подключить их