如何在aiogram FSM中删除最后一步的价格提示消息?
解决aiogram FSM最后一步无法删除提示消息的问题
核心问题是你进入price状态时发送的「Введите максимальную цену:」这条消息没有保存ID,导致后续处理用户输入时找不到它来删除。只需要把这条消息的ID存在FSM的状态数据里,就能在用户输入后删除它。
修改步骤:
- 保存提示消息ID到FSM状态
修改floor_choose函数,发送提示消息后把消息ID存入state:
async def floor_choose(callback: types.CallbackQuery, state: FSMContext): async with state.proxy() as data: data['floor'] = callback.data data['heating'] = None # заполнитель для таблицы, пока не написана функция await callback.message.delete() await FSMAdmin.next() # 发送提示消息并保存它的ID到state prompt_message = await callback.message.answer('Введите максимальную цену:') async with state.proxy() as data: data['prompt_msg_id'] = prompt_message.message_id
- 在价格处理函数中删除提示消息
修改max_price_choose函数,从state中取出消息ID并删除,同时增加异常处理避免报错:
async def max_price_choose(message: types.Message, state: FSMContext): async with state.proxy() as data: try: data['price'] = int(message.text) except ValueError: await message.reply('Введи число нормально') return # 让用户重新输入,不执行后续逻辑 # 删除之前的提示消息 try: await bot.delete_message(chat_id=message.chat.id, message_id=data['prompt_msg_id']) except Exception: pass # 消息可能已被用户手动删除,忽略异常 await message.answer( f"Выбранные параметры:\nГород: {data['city']}\nРайон: {data['district']}" f"\nКоличество комнат: {data['rooms']}\nЭтаж: {data['floor']}\nМаксимальная цена: {data['price']}") await message.delete() try: await sql_add_users_flat(state) await message.answer('Выбор сохранен') except Exception: await message.answer('Произошла ошибка, изменения не сохранены') await state.finish()
这样处理后,用户输入价格后,那条提示消息就会被自动删除了。
内容的提问来源于stack exchange,提问作者holavas
相关产品推荐
相关产品推荐

