Как записать в state значение инлайн кнопки?
Есть два хендлера обрабатывающие две инлайн кнопки. Мне нужно чтобы хендлер был один и стейт в хендлере принимал значение конкретно нажатой кнопки. Например при нажатии на кнопку "Мужской" вызывался хендлер, помещающий в стейт значение "Мужской". Тоже самое с женским, хендлер один и тот же но значение передает уже "Женский"
@dp.callback_query_handler(text='button_2', state=Form.gender)
async def callback_btn2(callback_query: types.CallbackQuery, state: FSMContext):
await bot.answer_callback_query(callback_query.id)
await state.update_data(gender="Женский")
await tell_info(callback_query, state)
@dp.callback_query_handler(text='button_1', state=Form.gender)
async def callback_btn1(callback_query: types.CallbackQuery, state: FSMContext):
await bot.answer_callback_query(callback_query.id)
print(callback_query)
await state.update_data(gender="Мужской")
await tell_info(callback_query, state)
async def set_gender(update: Union[types.Message, types.CallbackQuery]):
btn1 = InlineKeyboardButton('Мужской', callback_data='button_1')
btn2 = InlineKeyboardButton('Женский', callback_data='button_2')
kb1 = InlineKeyboardMarkup().row(btn1, btn2)
await bot.send_message(update.from_user.id, "Прекрасно! Какого вы пола?", reply_markup=kb1)
Ответы (1 шт):
Автор решения: oleksandrigo
→ Ссылка
Просто сделайте префикс перед данными prefix:data и этот префикс и фильтруйте.
@dp.callback_query_handler(text_startswith='gender_but:', state=Form.gender)
async def callback_btn2(callback_query: types.CallbackQuery, state: FSMContext):
# Делайте
await callback_query.answer()
# вместо await bot.answer_callback_query(callback_query.id)
dict_genders = {"male": "Мужской", "female": "Женский"}
await state.update_data(gender=dict_genders[callback_query.data.split(":")[1]])
await tell_info(callback_query, state)
async def set_gender(update: Union[types.Message, types.CallbackQuery]):
btn1 = InlineKeyboardButton('Мужской', callback_data='gender_but:male')
btn2 = InlineKeyboardButton('Женский', callback_data='gender_but:female')
kb1 = InlineKeyboardMarkup().row(btn1, btn2)
await bot.send_message(update.from_user.id, "Прекрасно! Какого вы пола?", reply_markup=kb1)