Вопрос по работе с двумя календарями aiogram 3
Только недавно погрузился в python + aiogram, начал делать своего бота .. многое непонятно ... но вроде как постепенно решаются возникающие вопросы. Сейчас возникла проблема, прошу помощи как ее решить. В общем бот на aiogram 3, в котором есть 2 inline кнопки по выводу заказов и продаж на определенную дату. По описания работы календря для aiogram 3 https://github.com/noXplode/aiogram_calendar понятно и работает корректно то, если это вопрос с одним календарем ... а мне фактически надо 2. В описании https://github.com/noXplode/aiogram_calendar при нажатии на кнопку календаря сначала срабатывает
@dp.message(F.text.lower() == 'navigation calendar')
после чего срабатывает
@dp.callback_query(SimpleCalendarCallback.filter())
... у меня же фактически 2 вариации
@dp.message(F.text.lower() == 'navigation calendar')
т.е. условно
@dp.message(F.text.lower() == 'navigation calendar for sales')
и
@dp.message(F.text.lower() == 'navigation calendar for orders')
... но по описанию следующий шаг
@dp.callback_query(SimpleCalendarCallback.filter())
срабатывает на выбор даты в календаре ... любом календаре .. Не могу понять как сделать так, чтобы при выборе кнопки
@dp.message(F.text.lower() == 'navigation calendar for sales')
он перебрасывал на
@dp.callback_query(SimpleCalendarCallback.filter())
для 'navigation calendar for sales', а при выборе
@dp.message(F.text.lower() == 'navigation calendar for orders')
он бы перебрасывал на
@dp.callback_query(SimpleCalendarCallback.filter())
для 'navigation calendar for orders' Надеюсь понятно объяснил.
Ответы (1 шт):
Я решил данную проблему с помощью состояний (State).
Создаем под каждый календарь отдельное состояние:
class Form(StatesGroup):
calendar_1 = State()
calendar_2 = State()
Запускаем состояния:
Первый календарь:
@dp.callback_query(F.data == "Подать заявку")
async def apply(callback: types.CallbackQuery, state: FSMContext):
"""запись заявки"""
await state.set_state(Form.calendar_1)
...
Второй календарь:
@dp.callback_query(F.data == "Перенос заявки")
async def transfer(callback: types.CallbackQuery, state: FSMContext):
"""Перенос заявки"""
await state.set_state(Form.calendar_2)
Далее ловим состояние:
Первый календарь:
@dp.callback_query(Form.calendar_1, SimpleCalendarCallback.filter())
async def process_simple_calendar(callback, callback_data, state: FSMContext):
...
Второй календарь:
@dp.callback_query(Form.calendar_2, SimpleCalendarCallback.filter())
async def process_simple_calendar(callback, callback_data, state: FSMContext):
...
Не забываем закрывать состояния.
PS
Не закрывайте состояние до момента полного окончания выбора даты.
Если закрыть состояние слишком рано будут траблы с выбором дня если листать месяцы вперед/назад, просто повиснет запрос.
Закрывать не раньше чем параметры selected
и date
(это стандартные из доки) выдадут результат True
:
if selected and date:
await state.clear()