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