Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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 SQLAlchemy merge()无法使用flask_Python_Orm_Sqlalchemy_Flask_Crud - Fatal编程技术网

Python SQLAlchemy merge()无法使用flask

Python SQLAlchemy merge()无法使用flask,python,orm,sqlalchemy,flask,crud,Python,Orm,Sqlalchemy,Flask,Crud,我正在学习如何使用sqlalchemy,我正在开发一个小应用程序。我在使用ORM更新数据库中存储的数据时遇到了一些问题。我不确定我错过了什么。表单edit\u product.html会填充正确的数据,但是返回重定向(url\u for语句会在不更新数据的情况下被触发。我正在使用merge(),我尝试按照一些教程的建议使用add(),但是如果这样做,我会收到一个错误,说明记录已经存在 这是我在views.py中的edit\u product功能: from database import db_

我正在学习如何使用sqlalchemy,我正在开发一个小应用程序。我在使用ORM更新数据库中存储的数据时遇到了一些问题。我不确定我错过了什么。表单
edit\u product.html
会填充正确的数据,但是
返回重定向(url\u for
语句会在不更新数据的情况下被触发。我正在使用merge(),我尝试按照一些教程的建议使用
add()
,但是如果这样做,我会收到一个错误,说明记录已经存在

这是我在
views.py
中的
edit\u product
功能:

from database import db_session
@app.route('/product/edit/<int:product_id>', methods=['GET', 'POST'])
def edit_product(product_id):
    product = Product.query.filter(Product.id == product_id).first()
    form = NewOtrosForm(obj=product)
    if request.method == 'POST':
        print request.form
        if form.validate():
            form.populate_obj(product)
            db_session.commit()
        return redirect(url_for('product'))
    else:
        return render_template('edit_product.html', form=form)
从数据库导入数据库\u会话
@app.route('/product/edit/',方法=['GET','POST'])
def编辑产品(产品id):
product=product.query.filter(product.id==product\u id).first()
表单=新的otrosform(obj=产品)
如果request.method==“POST”:
打印请求表
如果form.validate():
表格。填充_obj(产品)
db_session.commit()
返回重定向(“产品”)的url\u
其他:
返回呈现模板('edit\u product.html',form=form)
这是我在jinja2模板中编辑表单中的内容:

{% from "_formhelpers.html" import render_field %}
    <form method=post action="">
        <dl>
            {{ render_field(form.name) }}
            {{ render_field(form.price) }}
            {{ render_field(form.description) }}
            {{ render_field(form.provider) }}
            {{ render_field(form.detalles) }}
        </dl>
        <p><input type="submit" value="Save Changes"></p>
    </form>
{%来自“\u formhelpers.html”导入呈现\u字段%}
{{render_字段(form.name)}
{{render_字段(form.price)}
{{render_字段(form.description)}
{{render_字段(form.provider)}
{{render_field(form.detalles)}


您不需要在此处使用,它的目的是将状态从外部对象转移到会话中的新实例或现有实例中。您的
产品
对象已经属于会话,因此可以调用
表单。填充对象(产品)
(更改为
产品
将其标记为“脏的”在此会话中)和
db\u session.commit()
之后。

能否尝试更改以下内容:

form = NewOtrosForm(obj=product)
致:


感谢您的回复Audrius–我已经实现了您的建议,但是更新仍然没有得到处理。我已经更新了代码,反映了我根据您的建议所做的更改。这可能是models类本身的问题吗?我正在使用继承。提前感谢。可能是
产品
没有修改,所以
commit()
看不到任何更改,也不执行任何操作。请尝试在
表单之后检查
db\u session.dirty
populate\u obj(产品)
,如果它确实被修改了,它应该包含
产品
。我尝试了
脏的
,但也没有发生任何事情。我也尝试了调用名为
Otros的子类,但它也不起作用。你对
产品
为什么没有被修改有什么建议吗?我猜你的
表单
无法从
POST
请求中获取数据,并且由于您已从
product
中为其提供了值(
NewOtrosForm(obj=product)
),相同的数据正在被验证并返回给
产品
。因为它是相同的数据,
db\u会话
commit()上看不到任何更改,也不会发出
UPDATE
。谢谢@codegeek-我尝试使用你的建议,但它返回了
AttributeError:'Request'对象没有属性'POST'
。你使用的是WTForms还是WTForms?我使用的是WTForms。通过使用
Request.form
它被修复了。谢谢!
form = NewOtrosForm(request.form, obj=product)