@maksimpythonn

Проблемы с машинным состоянием aiogram?

Проблемы с машинным состоянием (FSM) aiogram.

Программа остаётся на втором State. Почему не знаю. Помогите пожалуйста

from aiogram import Dispatcher, types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup

from creat_bot import dp, bot
from Support import support_buttons
from General import general


class support_user(StatesGroup):
    subject = State()
    number_order = State()
    #description = State()

async def support(message: types.Message):
    await message.answer('Введите тему обращения')
    await support_user.subject.set()

async def support_subject(message: types.Message, state: FSMContext):
    await state.update_data(subject = message.text)
    await message.answer('Введите номер заказа')
    await support_user.next()

async def support_number_order(message: types.Message, state: FSMContext):
    await state.update_data(number_order = message.text)
    data = await state.get_data()
    await message.answer(f'Тема обращения: {data["subject"]}\n'
                         f'Номер заказа: {data["number_order"]}')

    await state.finish()
    
    
def register_handler_support(dp: Dispatcher):
    dp.register_message_handler(support, text='Техническая поддержка')
    dp.register_message_handler(support_subject)
    dp.register_message_handler(support_number_order)
  • Вопрос задан
  • 226 просмотров
Решения вопроса 1
i229194964
@i229194964
Веб разработчик
Проблема заключается в том, что при вызове функции support она не переходит к следующему состоянию support_user.subject. Это можно сделать с помощью метода next() объекта state в функции поддержки.
async def support(message: types.Message, state: FSMContext):
    await message.answer('Введите тему обращения')
    await state.set_state(support_user.subject)  # установить состояние subject


async def support_subject(message: types.Message, state: FSMContext):
    await state.update_data(subject=message.text)
    await message.answer('Введите номер заказа')
    await support_user.next()  # переход на следующее состояние

В support_subject, await support_user.next() также должен быть заменен на await state.set_state(support_user.number_order) для перехода к следующему состоянию.

Функция support_number_order также должна установить состояние с помощью await state.reset_state() и await state.finish().

Кроме того, при регистрации обработчика сообщений не забудьте передать объект состояния в функцию support.
dp.register_message_handler(support, state=support_user.subject)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы