大家好,
使用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)来向数据库添加数据,这非常有效。
我希望有人可以帮助我解决我失踪的问题,或者可以给我一个简短描述我做错的链接。我已搜索过多个帖子和其他帖子,但无法找到解决方案。
提前感谢您提供的每一项帮助。
答案 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
部分下方的表单分配,因为我认为他们用旧信息覆盖了提交的表单数据...抱歉,我第一次错过了这个!