0

我正在学习如何使用 sqlalchemy,并且正在开发小型应用程序。我在尝试使用 ORM 更新存储在数据库中的数据时遇到一些问题。我不确定我错过了什么。表单edit_product.html会填充正确的数据,但是return redirect(url_for会触发语句而不更新数据。我正在使用 merge(),我尝试add()按照一些教程的建议使用,但是如果我这样做,我会收到一条错误消息,指出记录已经存在。

这是我的edit_product功能views.py

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)

这是我在 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>
4

2 回答 2

1

您不需要merge()在这里使用 use,它的目的是将状态从外部对象转移到会话中的新实例或已经存在的实例。您的product对象已经属于会话,因此调用form.populate_obj(product)(更改以product在此会话中将其标记为“脏”)以及db_session.commit()之后调用就足够了。

于 2013-01-31T10:52:34.283 回答
1

您可以尝试更改以下内容:

form = NewOtrosForm(obj=product)

到:

form = NewOtrosForm(request.form, obj=product)
于 2013-01-31T17:00:46.100 回答