Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 SQLalchemy使用wtforms更新SQlite中的数据_Python 2.7_Flask_Sql Update_Flask Sqlalchemy_Wtforms - Fatal编程技术网

Python 2.7 SQLalchemy使用wtforms更新SQlite中的数据

Python 2.7 SQLalchemy使用wtforms更新SQlite中的数据,python-2.7,flask,sql-update,flask-sqlalchemy,wtforms,Python 2.7,Flask,Sql Update,Flask Sqlalchemy,Wtforms,大家好, 我在使用wtforms、SQLAlchemy和SQlite3编辑数据时遇到问题。我已经生成了一个表单,可以查询按ID过滤的数据。表单中完美地填充了相应的数据。但当我更改数据并按submit时,它不会更新数据。实际上有两个问题。首先,表单不会将新类型的数据传递回python和变量,其次,我不知道如何更新当前选定的数据行 这是我的代码: @app.route('/sensorlist_edit/<string:id>', methods=['GET', 'POST']) @is

大家好,

我在使用wtforms、SQLAlchemy和SQlite3编辑数据时遇到问题。我已经生成了一个表单,可以查询按ID过滤的数据。表单中完美地填充了相应的数据。但当我更改数据并按submit时,它不会更新数据。实际上有两个问题。首先,表单不会将新类型的数据传递回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)
这是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 %}
{%extends'layout.html%}
{%block body%}
编辑传感器
{%来自“includes/_formhelpers.html”导入呈现字段%}
{{render_字段(form.name,class=“form control”)}
{{render_字段(form.sensor_类型,class=“form control”)}
{{render_字段(form.pin,class=“form control”)}
{{render_字段(form.limit_temp_up,class=“form control”)}
{{render_字段(form.limit_temp_down,class=“form control”)}
{{render_字段(form.limit_hum_up,class=“form control”)}
{{render_字段(form.limit_hum_down,class=“form control”)}
{{render_字段(form.limit_aqua_temp_up,class=“form control”)}
{{render_字段(form.limit_aqua_temp_down,class=“form control”)}

{%endblock%}
我使用完全相同的表单、模型、python代码和模板(以及other.html)将数据添加到数据库中,这非常有效

我希望有人能帮助我弥补我所缺少的,或者能给我一个简短描述我做错了什么的链接。我已经搜索了多个线程和其他帖子,但找不到解决方案


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

您真的很接近了,在
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)
@app.route('/sensorlist_edit/',方法=['GET','POST']
@是否已登录
def传感器列表_编辑(id):
sensor=sensor.query.filter_by(id=id).first()
表单=传感器列表表单(request.form)
如果request.method==“POST”和form.validate():
sensor.name=form.name.data
sensor.sensor\u type=int(form.sensor\u type.data)
sensor.pin=form.pin.data
sensor.limit\u temp\u up=form.limit\u temp\u up.data
sensor.limit\u temp\u down=form.limit\u temp\u down.data
sensor.limit\u hum\u up=form.limit\u hum\u up.data
sensor.limit\u hum\u down=form.limit\u hum\u down.data
sensor.limit\u aqua\u temp\u up=form.limit\u aqua\u temp\u up.data
sensor.limit\u aqua\u temp\u down=form.limit\u aqua\u temp\u down.data
db.session.commit()
闪存(“您更新了传感器”,“成功”)
返回重定向(url_for('sensorlist_CRUD'))
form.name.data=sensor.name
form.sensor\u type.data=str(sensor.sensor\u type)
form.pin.data=sensor.pin
form.limit\u temp\u up.data=sensor.limit\u temp\u up
form.limit\u temp\u down.data=sensor.limit\u temp\u down
form.limit\u hum\u up.data=sensor.limit\u hum\u up
form.limit\u hum\u down.data=sensor.limit\u hum\u down
form.limit\u aqua\u temp\u up.data=sensor.limit\u aqua\u temp\u up
form.limit\u aqua\u temp\u down.data=sensor.limit\u aqua\u temp\u down
返回渲染模板('sensorlist\u edit.html',form=form)
更新:
我把表格作业移到了
POST
部分下面,因为我认为它们用旧信息覆盖了提交的表格数据。。。对不起,我第一次错过了

谢谢你的回复。奇怪的是它没有效果。。。当我传递包含变量的flash消息时,它仍然传递来自数据库的数据,而不是表单中新键入的数据?它看起来像是表单,当从数据库中填充数据时,键入时不要在表单字段中排除新数据。您仍然缺少
db.session.add(sensor)
。另一个注意事项是,最好执行
sensor=sensor.query.get_或_404(id)
,这样,如果用户将url中的id编辑为某些虚假数据,您的脚本中不会出现错误。您不需要将现有对象添加回会话。。。如果要向表中添加新记录,则只需使用
db.session.add(…)
,如果像OP一样查询以接收记录,则不需要这样做needed@Thijs查看更新。。。我想你是在用旧的数据库信息覆盖新发布的表单数据。。。试试看,我想这会解决你的问题problem@abigperson拯救谢谢,这是拼图的最后一块了。它现在工作得很好。谢谢你的帮助和时间。谢谢大家分享他们的想法
@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)