SQLalchemy 使用 wtforms 在 SQlite 中更新数据

SQLalchemy update data in SQlite using wtforms

大家好,

我在使用 wtforms、SQLAlchemy 和 SQlite3 编辑数据时遇到问题。我已经生成了一个表单,可以查询按ID过滤的数据。表格完美地填满了相应的数据。但是当我更改数据并按提交时,它不会更新数据。实际上有两个问题。首先,表单不会将新类型的数据传回 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 使用此代码生成:

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)

这是来自 wtforms 的 Jinja 模板:

{% 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)将数据添加到数据库中,并且效果很好。

我希望有人可以帮助我解决我所遗漏的问题,或者可以给我 link 对我做错了什么的简短描述。我已经搜索了多个线程和其他帖子,但找不到解决方案。

在此先感谢您提供的所有帮助。

你真的很接近,在 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 部分下方,因为我认为它们用旧信息覆盖了提交的表单数据...抱歉我第一次错过了!!