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

ここでuseを使用する必要はありませんmerge()。その目的は、外部オブジェクトからセッション内の新しいインスタンスまたは既存のインスタンスに状態を転送することです。オブジェクトproductはすでにセッションに属しているので、呼び出して(このセッションで「ダーティ」としてマークするようにform.populate_obj(product)変更)、その後で十分です。productdb_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 に答える