Как преобразовать в один вид два callback хэндлера?

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

Есть тг бот который создаёт динамические кнопки, есть команда /test, которая создаёт новые кнопки и выводит их callback с БД. Есть функция удаления данных из БД, которая выводит весь список кроссовок из БД и под каждой строкой создаёт кнопку удаления данных из БД. Но я не понял как сделать чтобы могли работать два хэндлера, работает только верхний хэндлер.

Код вывода, создания кнопок:

@dp.message_handler(commands=['test'])
async def test(message: types.Message):
    items = [row[0] for row in db.cur.execute('SELECT model FROM items').fetchall()]
    markup = InlineKeyboardMarkup(row_width=2)  # создаём клавиатуру
    for model in items:
        markup.add(InlineKeyboardButton(text=model, callback_data=model))
    await bot.send_message(message.chat.id, "Выберите", reply_markup=markup)


@dp.callback_query_handler()
async def callback_query_keyboard_shoes(callback_query: types.CallbackQuery):
    items = [row[0] for row in db.cur.execute('SELECT model FROM items').fetchall()]
    for model in items:
        if callback_query.data == model:
            brend2_name = model
            # получение данных из таблицы
            db.cur.execute("SELECT model, price, brang, photo_it FROM items WHERE model = ?",
                           (brend2_name,))
            data = db.cur.fetchall()
 # форматирование данных в виде строки
            text = ''
            for row in data:
                text += f"model: {row[0]}\n price: {row[1]}\nbrend: {row[2]}"
                await bot.send_message(callback_query.from_user.id, text=text)
                await bot.send_photo(callback_query.from_user.id, photo=row[3])


@dp.callback_query_handler(lambda x: x.data and x.data.startswith('del '))
async def del_callback_run(callback_query: types.CallbackQuery):
    await db.sql_delete_command(callback_query.data.replace('del ', ''))
    await callback_query.answer(text=f'{callback_query.data.replace("del ", "")} удалена', show_alert=True)


@dp.message_handler(text='Удалить товар')
async def delete_items(message: types.Message):
    if message.from_user.id == int(ADMIN_ID):
        read = await db.sql_read2()
        for ret in read:
            await bot.send_photo(message.chat.id, ret[3], f"Модель: {ret[1]}\nЦена: {ret[2]}\nБренд {ret[4]}")
            await bot.send_message(message.chat.id, text='^^^', reply_markup=InlineKeyboardMarkup().\
                                   add(InlineKeyboardButton(f'Удалить {ret[1]}', callback_data=f"del {ret[1]}")))
    else:
       await bot.send_message(message.chat.id, "Я тебя не понимаю")

Ответы

▲ 0

при создании кнопок для удаления товара в функции delete_items, вы не указали, какой тип кнопки должен быть создан, поэтому Telegram API ожидает нажатия кнопки с типом text, что вызывает обработчик сообщений, а не обработчик колбэк-запросов

@dp.message_handler(text='Удалить товар')
async def delete_items(message: types.Message):
    if message.from_user.id == int(ADMIN_ID):
        read = await db.sql_read2()
        for ret in read:
            await bot.send_photo(message.chat.id, ret[3], f"Модель: {ret[1]}\nЦена: {ret[2]}\nБренд {ret[4]}")
            await bot.send_message(message.chat.id, text='^^^', reply_markup=InlineKeyboardMarkup().\
                                   add(InlineKeyboardButton(f'Удалить {ret[1]}', callback_data=f"del {ret[1]}")))
    else:
       await bot.send_message(message.chat.id, "Я тебя не понимаю")