@RinoStop

Не сохраняет обновленные данные, после машины состояний, как быть?

Есть код. Пользователь нажимает на кнопку "✏ учителя" и ему отправляет список преподавателей вместе с кнопкой "Изменить" под каждым из них. После нажатия бот спрашивает у пользователя новые значения (Имя,Фамилия,Отчество,Предмет,Кабинет ) и должен сохранять их в базу данных в таблицу "teachers", но увы не обновляет старые значения.

Код в файле admin.py:

#___________________________________________ИЗМЕНЕНИЕ УЧИТЕЛЯ___________________________________________________________



@dp.message_handler(lambda message: '✏ учителя' in message.text)
async def edit_teachers_handler(message: types.Message):
    if message.from_user.id == ID:
        # Получение всех учителей из базы данных
        teachers = await sqlite_db.get_teachers()
        if teachers:
            for teacher in teachers:
                teacher_info = f"ФИО: {teacher['first_name']} {teacher['last_name']} {teacher['patronymic']}\n"
                teacher_info += f"Предмет: {teacher['subject']}\n"
                teacher_info += f"Кабинет: {teacher['classroom']}\n\n"
                # Создание кнопки "Изменить" с идентификатором преподавателя
                edit_button = types.InlineKeyboardButton('Изменить', callback_data=f"edit_teacher:{teacher['id']}")
                keyboard = types.InlineKeyboardMarkup().add(edit_button)
                await bot.send_message(message.chat.id, teacher_info, reply_markup=keyboard)
        else:
            await bot.send_message(message.chat.id, "Список учителей пуст.")



@dp.callback_query_handler(lambda query: query.data.startswith("edit_teacher:"))
async def edit_teacher_handler(query: types.CallbackQuery):
    teacher_id = query.data.split(":")[1]
    if query.from_user.id == ID:
        # Запрашиваем новые данные о преподавателе
        await bot.send_message(query.from_user.id, "Введите новые данные о преподавателе:")
        await bot.send_message(query.from_user.id, "Введите ФИО:")
        await MyStates.waiting_for_fio.set()  # Устанавливаем состояние ожидания ФИО
    else:
        await bot.send_message(query.from_user.id, "У вас нет прав для выполнения данной операции.")


@dp.message_handler(state=MyStates.waiting_for_fio)
async def process_fio(message: types.Message, state: FSMContext):
    fio = message.text.split()
    if len(fio) >= 3:
        first_name = fio[0]
        last_name = fio[1]
        patronymic = " ".join(fio[2:])
        await state.update_data(first_name=first_name, last_name=last_name, patronymic=patronymic)
        await bot.send_message(message.chat.id, "Введите предмет:")
        await MyStates.waiting_for_subject.set()  # Устанавливаем состояние ожидания предмета
    else:
        await bot.send_message(message.chat.id, "Некорректный формат ФИО. Введите Фамилию, Имя и Отчество.")


@dp.message_handler(state=MyStates.waiting_for_subject)
async def process_subject(message: types.Message, state: FSMContext):
    subject = message.text
    await state.update_data(subject=subject)
    await bot.send_message(message.chat.id, "Введите кабинет:")
    await MyStates.waiting_for_classroom.set()  # Устанавливаем состояние ожидания кабинета


@dp.message_handler(state=MyStates.waiting_for_classroom)
async def process_classroom(message: types.Message, state: FSMContext):
    classroom = message.text
    await state.update_data(classroom=classroom)

    # Получаем данные из состояния
    data = await state.get_data()
    first_name = data.get('first_name')
    last_name = data.get('last_name')
    patronymic = data.get('patronymic')
    subject = data.get('subject')
    classroom = data.get('classroom')

    # Получаем идентификатор преподавателя из message.text
    teacher_id = message.text.split(":")[1] if len(message.text.split(":")) > 1 else None

    # Сохраняем новые значения в базе данных
    await sqlite_db.update_teacher(teacher_id, first_name, last_name, patronymic, subject, classroom)

    # Отправляем подтверждение об изменении
    await bot.send_message(message.chat.id, "Данные об учителе успешно изменены.")

    await state.finish()  # Завершаем состояние


Код в файле sqlite_db.py:

async def get_teachers():
    cur.execute("SELECT * FROM teachers")
    rows = cur.fetchall()
    teachers = []
    for row in rows:
        teacher = {
            'id': row[0],
            'first_name': row[1],
            'last_name': row[2],
            'patronymic': row[3],
            'subject': row[4],
            'classroom': row[5]
        }
        teachers.append(teacher)
    return teachers




async def update_teacher(teacher_id, first_name, last_name, patronymic, subject, classroom):
    cur.execute("UPDATE teachers SET Surname=?, Name=?, Lastname=?, Subject=?, KB=? WHERE id=?",
                (last_name, first_name, patronymic, subject, classroom, teacher_id))
    base.commit()

646a28790cbaa017912369.png
646a28a4b1287486323109.png
646a28e19d555450495441.png
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix
yellow
teacher_id нужно запоминать на моменте edit_teacher_handler, так же сохранив его в FSM.

На моменте
Получаем идентификатор преподавателя из message.text
в message.text ведь лежит номер класса. К тому же наверное в БД ID является числом, а не строкой. Пробовали смотреть какие данные приходят в update_teacher?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час