Как динамично подгружать data?

Рейтинг: 0Ответов: 1Опубликовано: 26.07.2023

Всем привет.

Столкнулся с такой проблемой. Я генерирую inline-кнопки с помощью InlineKeyboardBuilder. Текст и callback_data подгружаю из базы.

Далее такая ситуация:

@router.callback_query(F.data == 'select_dues_pressed')
async def show_dues(callback: CallbackQuery):
    dues_name = await read_dues_name()
    keyboard = create_inline_kb(2, last_btn='Назад', *dues_name)
    await callback.message.edit_text(text=MENU_ADMIN_PANEL['select_dues'],
                                     reply_markup=keyboard)

Так выглядит клавиатура:

введите сюда описание изображения

В этой клавиатуре количество кнопок может быть разным, так как база постоянно изменяется. После хэдлера, который я показал раннее, должны следовать другие хэндлеры, чтобы обрабатывать нажатые кнопки.

Но я ведь не могу создать определенное количество таких хэндлеров, так как, напоминаю, количество кнопок может меняться. Что же в таком случае делать?

Ответы

▲ 0

Если Вам нужна функция которая будет делать любое количество кнопок :

    async def create_inline_button(*buttons, row_width: int = 1):
        """
        This method creates one or more buttons for the inline keyboard.

        :param buttons: Example: {'text': 'btn_1', 'callback_data': 'btn_1'}
        :type buttons: dict
        :param row_width: Keyboard line width. Default is 1.
        :type row_width: int
        :return: InlineKeyboardMarkup object containing the built-in buttons.
        :rtype: InlineKeyboardMarkup
        """
        inline_keyboard = InlineKeyboardMarkup(row_width=row_width)
        for button in buttons:
            inline_keyboard.add(InlineKeyboardButton(text=button['text'], callback_data=button['callback_data']))

        return inline_keyboard

Если вам необходима функция которая будет принимать все колбеки

@dp.register_callback_query_handler(lambda c: c.data, state=fsm_menu.main_menu)

внутри данной функции вы уже сможите подгружать информацию из базы и с помощью исключений и цикла получать желанный результат.