Задать вопрос
@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)
  • Вопрос задан
  • 304 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    1C-разработчик
    8 месяцев
    Далее
  • Нетология
    Python-разработчик с нуля
    6 месяцев
    Далее
Решения вопроса 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)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
LIAN Москва
от 270 000 до 300 000 ₽
НТЦ ПРОТЕЙ Санкт-Петербург
от 150 000 до 330 000 ₽
Aporia Севастополь
До 150 000 ₽