Как получить calback_data в dp.callback_query_handler в aiogram
есть код который должен:
- при отправке команды "Загрузить тест" выводить n количество инлайн кнопок
- при нажатии на любую кнопку вывзывается callback handler и в нем надо получить callback_data
async def upload_file(message: types.Message):
kb_lectures_list = InlineKeyboardMarkup()
lectures_name_list = lectures_df["video_name"].tolist()
for lecture_name in lectures_name_list:
button = InlineKeyboardButton(lecture_name, callback_data=lecture_name)
print(button.callback_data)
kb_lectures_list.row(button)
await message.answer("выберите лекцию, к которой нужно прикрепить тест", reply_markup=kb_lectures_list)
await Upload_f.file_name.set()
@dp.callback_query_handler(lambda c: c.data,state=Upload_f.file_name)
async def get_file_name(call: CallbackQuery, state: FSMContext):
answer = call.message.text
print(call.message.text)
await state.update_data(file_name=answer)
await call.message.answer("отправьте файл с тестом")
await Upload_f.file_id.set()
Как это сделать? Мой код при выводе file name выводит "выберите лекцию, к которой нужно прикрепить тест"
Ответы (2 шт):
Автор решения: Bellisa
→ Ссылка
async def upload_file(message: types.Message):
kb_lectures_list = InlineKeyboardMarkup()
lectures_name_list = lectures_df["video_name"].tolist()
for lecture_name in lectures_name_list:
button = InlineKeyboardButton(lecture_name, callback_data=lecture_name)
print(button.callback_data)
kb_lectures_list.row(button)
Данные callback_data должны быть указаны в ковычках:
button = InlineKeyboardButton(lecture_name, callback_data='lecture_name')
При нажатии на инлайн-кнопку callback_query_hanlder ловит дату и по ней запускает машину состояний:
@dp.callback_query_handler(text='lecture_name', state =None)#начальный хэндлер, нет никаких состояний, реагирует на дату с инлайн кнопки
async def start(call: types.CallbackQuery) #ловит первое состояние state
await Upload_f.file_id.set()#принимает это состояние
await message.reply('Отправь файл')
@dp.message_handler(content_types:['file'], state=FSMAfmin.file_id) #обрабатывает это состояние state, как файл
async def load_file(message: types.Message, state = FSMContext):
async with state.proxy() as data:
data['file_id'] = message.file[0].file_id #насчет этой строчки не уверен, вроде файл импортируется также, как фото, но это не точно
await FSMAdmin.next()#переходит на следующее состояние, по аналогии ловит состояния и обрабатывает их
await state.finish() #конец машины состояний, всё, что Вы хотите сделать с данными нужно записать до этой команды, после неё машина отчищается
Надеюсь, правильно понял и помог