SQLalchemy使用wtforms在SQlite中更新数据

时间:2018-04-20 20:54:10

标签: python-2.7 flask sql-update flask-sqlalchemy 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 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-code和模板(以及其他.html)来向数据库添加数据,这非常有效。

我希望有人可以帮助我解决我失踪的问题,或者可以给我一个简短描述我做错的链接。我已搜索过多个帖子和其他帖子,但无法找到解决方案。

提前感谢您提供的每一项帮助。

1 个答案:

答案 0 :(得分:0)

你真的很接近,在你需要更新实际模型的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部分下方的表单分配,因为我认为他们用旧信息覆盖了提交的表单数据...抱歉,我第一次错过了这个!