Как сделать, чтобы создавались кнопки и после выводить кнопки моделей?

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

помогите, пожалуйста, хочу сделать, чтобы создавались кнопки брендов кроссовок. Они создаются замечательно, но надо сделать чтобы если пользователь нажмёт на кнопку бренда кроссовка, то будут создаваться инлайн кнопки моделей этого бренда и выводиться МОДЕЛИ только этого бренда (пример: мы нажимаем на кнопку nike и нам выводит сообщение с инлайн кнопками моделей бренда найк, С другими брендами также). Примерно как на скрине. введите сюда описание изображения

Код колбэков:

@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])

    if callback_query.data == 'shoes':
        items = [row[0] for row in db.cur.execute('SELECT brang FROM items').fetchall()]
        markup = InlineKeyboardMarkup(row_width=1)  # создаём клавиатуру
        for brang in items:
            markup.add(InlineKeyboardButton(text=brang, callback_data=brang))
        await bot.send_message(callback_query.from_user.id, "Выберите бренд", reply_markup=markup)
    items = [row[0] for row in db.cur.execute('SELECT brang FROM items').fetchall()]
    for brang in items:
        if callback_query.data == brang:
            items = [row[0] for row in db.cur.execute('SELECT model FROM items').fetchall()]
            markup = InlineKeyboardMarkup(row_width=1)  # создаём клавиатуру
            for model in items:
                markup.add(InlineKeyboardButton(text=model, callback_data=model))
            await bot.send_message(callback_query.from_user.id, "Выберите модель", reply_markup=markup)

Ответы

▲ 0Принят

Если проще:

@dp.callback_query_handler(lambda c: c.data == 'shoes')
async def choose_brand(callback_query: types.CallbackQuery):
    items = [row[0] for row in db.cur.execute('SELECT brang FROM items').fetchall()]
    markup = InlineKeyboardMarkup(row_width=1)
    for brang in items:
        markup.add(InlineKeyboardButton(text=brang, callback_data=f"brand_{brang}"))
    await bot.send_message(callback_query.from_user.id, "Выберите бренд", reply_markup=markup)


@dp.callback_query_handler(lambda c: c.data.startswith('brand_'))
async def choose_model(callback_query: types.CallbackQuery):
    brang = callback_query.data.split('_')[1]
    items = [row[0] for row in db.cur.execute('SELECT model FROM items WHERE brang = ?', (brang,)).fetchall()]
    markup = InlineKeyboardMarkup(row_width=1)
    for model in items:
        markup.add(InlineKeyboardButton(text=model, callback_data=f"model_{model}"))
    await bot.send_message(callback_query.from_user.id, f"Выберите модель бренда {brang}", reply_markup=markup)


@dp.callback_query_handler(lambda c: c.data.startswith('model_'))
async def show_item(callback_query: types.CallbackQuery):
    model = callback_query.data.split('_')[1]
    # получение данных из таблицы
    db.cur.execute("SELECT model, price, brang, photo_it FROM items WHERE model = ?",
                               (model,))
    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])

Жмешь на Выберите бренд - вызывается каллбек choose_brand, который тянет с бд бренды, формирует клавиатуру и отправляет юзеру.