Python SQLAlchemy merge()无法使用flask
我正在学习如何使用sqlalchemy,我正在开发一个小应用程序。我在使用ORM更新数据库中存储的数据时遇到了一些问题。我不确定我错过了什么。表单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_
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)