SQLalchemy обновляет данные в SQlite с помощью wtforms

Привет всем,

У меня проблема с редактированием данных с помощью wtforms, SQLAlchemy и SQlite3. Я создал форму и могу запрашивать данные, отфильтрованные по идентификатору. Форма отлично заполнена соответствующими данными. Но когда я изменяю данные и нажимаю «Отправить», данные не обновляются. На самом деле есть две проблемы. Во-первых, формы не передают новые типизированные данные обратно в Python и переменные, а во-вторых, я не могу понять, как обновить текущую выбранную строку данных.

Вот мой код:

@app.route('/sensorlist_edit/<string:id>', methods=['GET', 'POST'])
@is_logged_in
def sensorlist_edit(id):
    sensor = Sensor.query.filter_by(id=id).first()
    form = SensorListForm(request.form)
    form.name.data = sensor.name
    form.sensor_type.data = str(sensor.sensor_type)
    form.pin.data = sensor.pin
    form.limit_temp_up.data = sensor.limit_temp_up
    form.limit_temp_down.data = sensor.limit_temp_down
    form.limit_hum_up.data = sensor.limit_hum_up
    form.limit_hum_down.data = sensor.limit_hum_down
    form.limit_aqua_temp_up.data = sensor.limit_aqua_temp_up
    form.limit_aqua_temp_down.data = sensor.limit_aqua_temp_down

    if request.method == 'POST' and form.validate():
        name = form.name.data
        sensor_type = int(form.sensor_type.data)
        pin = form.pin.data
        limit_temp_up = form.limit_temp_up.data
        limit_temp_down = form.limit_temp_down.data
        limit_hum_up = form.limit_hum_up.data
        limit_hum_down = form.limit_hum_down.data
        limit_aqua_temp_up = form.limit_aqua_temp_up.data
        limit_aqua_temp_down = form.limit_aqua_temp_down.data

        db.session.commit()

        flash('You updated a sensor', 'success')

        return redirect(url_for('sensorlist_CRUD'))
    return render_template('sensorlist_edit.html', form=form)

Класс модели создается с помощью этого кода:

class Sensor(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    sensor_type = db.Column(db.Integer)
    pin = db.Column(db.Integer)
    limit_temp_up = db.Column(db.Float)
    limit_temp_down = db.Column(db.Float)
    limit_hum_up = db.Column(db.Float)
    limit_hum_down = db.Column(db.Float)
    limit_aqua_temp_up = db.Column(db.Float)
    limit_aqua_temp_down = db.Column(db.Float)

А вот шаблон Jinja из wtforms:

{% extends 'layout.html' %}

{% block body %}
  <h2><b>Edit Sensor</b></h2>
  {% from "includes/_formhelpers.html" import render_field %}
  <form method = "POST" action = "">
    <div class = "form-group">
      {{render_field(form.name, class_ = "form-control")}}
    </div>
    <div class = "form-group">
      {{render_field(form.sensor_type, class_ = "form-control")}}
    </div>
    <div class = "form-group">
      {{render_field(form.pin, class_ = "form-control")}}
    </div>
    <div class = "form-group">
      {{render_field(form.limit_temp_up, class_ = "form-control")}}
    </div>
    <div class = "form-group">
      {{render_field(form.limit_temp_down, class_ = "form-control")}}
    </div>
    <div class = "form-group">
      {{render_field(form.limit_hum_up, class_ = "form-control")}}
    </div>
    <div class = "form-group">
      {{render_field(form.limit_hum_down, class_ = "form-control")}}
    </div>
    <div class = "form-group">
      {{render_field(form.limit_aqua_temp_up, class_ = "form-control")}}
    </div>
    <div class = "form-group">
      {{render_field(form.limit_aqua_temp_down, class_ = "form-control")}}
    </div>
    <p><input type = "submit" class = "btn btn-primary" value = "Submit"></p>
  </form>
{% endblock %}

Я использую точно такую ​​же форму, модель, код Python и шаблон (с другим .html) для добавления данных в базу данных, и это отлично работает.

Я надеюсь, что кто-то может помочь мне с тем, что мне не хватает, или может дать мне ссылку с кратким описанием того, что я делаю не так. Я уже просмотрел несколько тем и других сообщений, но не нашел решения.

Заранее благодарим за любую помощь, которую вы оказываете.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
237
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы действительно близки, в вашем коде под блоком POST вам нужно обновить фактическую модель ... прямо сейчас вы просто устанавливаете кучу переменных с данными формы, но они не применяются к модели. Как это:

@app.route('/sensorlist_edit/<string:id>', methods=['GET', 'POST'])
@is_logged_in
def sensorlist_edit(id):
    sensor = Sensor.query.filter_by(id=id).first()
    form = SensorListForm(request.form)

    if request.method == 'POST' and form.validate():
        sensor.name = form.name.data
        sensor.sensor_type = int(form.sensor_type.data)
        sensor.pin = form.pin.data
        sensor.limit_temp_up = form.limit_temp_up.data
        sensor.limit_temp_down = form.limit_temp_down.data
        sensor.limit_hum_up = form.limit_hum_up.data
        sensor.limit_hum_down = form.limit_hum_down.data
        sensor.limit_aqua_temp_up = form.limit_aqua_temp_up.data
        sensor.limit_aqua_temp_down = form.limit_aqua_temp_down.data

        db.session.commit()

        flash('You updated a sensor', 'success')

        return redirect(url_for('sensorlist_CRUD'))

    form.name.data = sensor.name
    form.sensor_type.data = str(sensor.sensor_type)
    form.pin.data = sensor.pin
    form.limit_temp_up.data = sensor.limit_temp_up
    form.limit_temp_down.data = sensor.limit_temp_down
    form.limit_hum_up.data = sensor.limit_hum_up
    form.limit_hum_down.data = sensor.limit_hum_down
    form.limit_aqua_temp_up.data = sensor.limit_aqua_temp_up
    form.limit_aqua_temp_down.data = sensor.limit_aqua_temp_down

    return render_template('sensorlist_edit.html', form=form)

Обновлять:

Я переместил назначения форм под раздел POST, так как я думаю, что они перезаписывали отправленные данные формы старой информацией ... извините, я пропустил это в первый раз !!

Спасибо за ответ. Как ни странно, это не имеет никакого эффекта ... Когда я передаю флэш-сообщение с переменной в нем, оно по-прежнему передает данные из базы данных, а не новые типизированные данные в форме? Похоже, что форма при заполнении данными из базы данных не исключает новых данных в полях формы при вводе.

Thijs 20.04.2018 23:32

Вам все еще не хватает db.session.add(sensor). Еще одно замечание, лучше сделать sensor = Sensor.query.get_or_404(id), поэтому, если пользователь изменяет идентификатор в URL-адресе на какие-то поддельные данные, вы не получите ошибку в своем скрипте.

Joost 21.04.2018 00:42

вам не нужно добавлять существующий объект обратно в сеанс ... вам нужно использовать db.session.add(...) только в том случае, если вы добавляете новую запись в таблицу, если вы запрашиваете получение записи, как это делает OP, это не нужный

abigperson 21.04.2018 01:17

@Thijs видят обновления ... Я думаю, вы перезаписывали новые опубликованные данные формы с помощью старой информации о базе данных ... попробуйте, и я думаю, что это решит вашу проблему

abigperson 21.04.2018 01:25

@abigperson Спасение !!! Спасибо, это был последний кусок головоломки. Теперь он работает отлично. Спасибо за помощь и время. И спасибо всем за то, что поделились своими мыслями

Thijs 21.04.2018 14:23

Другие вопросы по теме