когда добавляешь товар то создаётся кнопка с названием бренда, но она повторяется
Когда добавляешь новый товар, то кнопка c названием бренда создаётся, даже если такая есть.
Помогите пожалуйста пофиксить, на скрине видна проблема, создались 2 кнопки "найк".
Код создания и вывода инлайн кнопок:
@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])
Ответы (1 шт):
Автор решения: cool rage
→ Ссылка
Добавил проверку на наличие уже существующей кнопки перед созданием.
в sql запрос добавил DISTINCT, которое позволяет выбрать уникальные элементы из бд, если не подойдет - сотрешь.
if callback_query.data == 'shoes':
# Получаем список уникальных брендов из базы данных
brands = db.cur.execute('SELECT DISTINCT brand FROM items').fetchall()
# Создаем список кнопок, пропуская бренды, которые уже есть в меню
markup = InlineKeyboardMarkup()
buttons = [InlineKeyboardButton(text=row[0], callback_data=f"brand_{row[0]}") for row in brands
if not any(row[0] in button.text for button in markup.inline_keyboard)]
# Если список кнопок не пустой, создаем разметку клавиатуры и отправляем сообщение пользователю
if buttons:
markup = markup.add(*buttons)
await bot.send_message(callback_query.from_user.id, "Выберите бренд", reply_markup=markup)
else:
await bot.send_message(callback_query.from_user.id, "Все бренды уже добавлены")
