@User1Mark

Как записать в FSM state свое значение или как словить callback и записать его в state?

Aiogram 3
Не нашел как можно получить callback и записать его в state, поэтому решил сделать примитивно (тем более там всего 4 варианта) и обработать каждый вариант. Но после этого мне нужно записать полученную категорию куда - нибудь, чтобы после этого я мог использовать ее в следующей функции расчета стоимости.

from aiogram import Router, F
from aiogram.types import CallbackQuery, Message
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import StatesGroup, State

from app.keyboards import calculation as kb
from app.texts import calculation as txt


router = Router()


choosed_category = ''
class CalculateCost(StatesGroup):
    choosing_cost = State()



@router.callback_query(F.data == 'calculation')
async def calculation(callback: CallbackQuery):
    await callback.answer()
    await callback.message.answer(txt.category, reply_markup=kb.category)


@router.callback_query(F.data == 'shirt_shorts')
async def ss(callback: CallbackQuery, state: FSMContext):
    global choosed_category
    choosed_category = callback.data
    await callback.answer()
    await callback.message.answer('Ты выбрал(а) категорию Футболка / Шорты \n' + txt.calculation)
    await state.set_state(CalculateCost.choosing_cost)


@router.callback_query(F.data == 'sweatshirt_pants')
async def sp(callback: CallbackQuery, state: FSMContext):
    global choosed_category
    choosed_category = callback.data
    await callback.answer()
    await callback.message.answer('Ты выбрал(а) категорию Толстовка / Штаны \n' + txt.calculation)
    await state.set_state(CalculateCost.choosing_cost)


@router.callback_query(F.data == 'footwear_outerwear')
async def fo(callback: CallbackQuery, state: FSMContext):
    global choosed_category
    choosed_category = callback.data
    await callback.answer()
    await callback.message.answer('Ты выбрал(а) категорию Обувь / Верхняя одежда \n' + txt.calculation)
    await state.set_state(CalculateCost.choosing_cost)


@router.callback_query(F.data == 'socks_underwear')
async def su(callback: CallbackQuery, state: FSMContext):
    global choosed_category
    choosed_category = callback.data
    await callback.answer()
    await callback.message.answer('Ты выбрал(а) категорию Носки / Нижнее белье \n' + txt.calculation)
    await state.set_state(CalculateCost.choosing_cost)


@router.message(CalculateCost.choosing_cost)
async def calculate(message: Message, state: FSMContext):

    try:
        cost = int(message.text)
        if choosed_category == 'shirt_shorts':
            cost = cost * 1
        elif choosed_category == 'sweatshirt_pants':
            cost = cost * 2
        elif choosed_category == 'footwear_outerwear':
            cost = cost * 3
        elif choosed_category == 'socks_underwear':
            cost = cost * 4

        await message.answer(txt.calculate[0] + '<u>' + str(cost) + '</u>' + txt.calculate[1], reply_markup=kb.calculate)
        await state.clear()

    except ValueError:
        await message.answer(txt.calculate_wrong)
        await state.set_state(CalculateCost.choosing_cost)
  • Вопрос задан
  • 1616 просмотров
Решения вопроса 1
@twistfire92
Python backend developer
Уберите global переменную choosed_category

@router.callback_query(F.data == 'shirt_shorts')
async def ss(callback: CallbackQuery, state: FSMContext):
    await state.set_data({"choosed_category": shirt_shorts}) # прокидываем в state нужные данные
    # либо await state.update_data(choosed_category=shirt_shorts)
    await callback.answer()
    await callback.message.answer('Ты выбрал(а) категорию Футболка / Шорты \n' + txt.calculation)
    await state.set_state(CalculateCost.choosing_cost)

....

@router.message(CalculateCost.choosing_cost)
async def calculate(message: Message, state: FSMContext):
    state_data = await state.get_data()
    choosed_category = state_data["choosed_category]
    ....

По-хорошему все 4 функции с обработкой калбеков можно сократить в одну, но это уже не тема вопроса
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы