19

私のアプリケーションでは、Flask、Flask-SQLAlchemy、Flask-WTF、および Jinja2 を組み合わせて使用​​しています。

現在の化身では、設定テーブルがあります。テーブルには、1 つのフィールドを持つ 1 つのレコードのみが含まれます。最初、テーブルにはゼロのレコードが含まれています。

私が達成したいことは次のとおりです。

  • データベースにエントリが存在しない場合、ユーザー入力の準備ができている空のフォームを表示します
  • エントリが存在する場合、エントリを表示し、
  • ユーザーが値を変更した場合は、db の rec を更新します。

これが私のコードです:

models.py

class Provider(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    rssfeed = db.Column(db.String(120), unique = True)

    def __init__(self, rssfeed):
        self.rssfeed = rssfeed

    def __repr__(self):
        return '<NZBMatrix feed url %r>' % self.rssfeed

フォーム.py

class SettingsForm(Form):
    rssfeed = TextField('rssfed', validators= [Required()])

ビュー.py

    @app.route('/settings', methods=["GET","POST"])
    def settings():
    """ show settings """
        provider = Provider.query.get(1)
        form = SettingsForm(obj=provider)
        print provider

        if request.method == "POST" and form.validate():
            if Provider.query.get(1) is None:
                provider = Provider(rssfeed=form.rssfeed.data)
                form.populate_obj(provider)
                db.session.add(provider)
                db.session.commit()
                flash("Settings added")

        return render_template("settings.html", form=form)

現状では、レコードが存在しないがrssfeed列が空の場合、このコードはレコードを作成します。

INSERTレコードが存在しない場合と存在する場合に、このコードを変更するにはどうすれUPDATEばよいですか?

4

2 に答える 2

31

フォームが検証されると、

新しいレコードを追加するには:

new_provider = Provider(form.rssfeed.data)
db.session.add(new_provider)
db.session.commit()

既存のレコードを更新するには:

existing_provider = Provider.query.get(1) # or whatever
# update the rssfeed column
existing_provider.rssfeed = form.rssfeed.data
db.session.commit()

更新の秘訣は、特定のフィールドを変更してコミットするだけでよいということです。残りはdbセッションによって処理されます。SQLAlchemy で廃止されたマージ関数を使用していると思います。

于 2012-08-02T21:50:07.207 に答える
4

view.pyファイルにこれらの変更を加えることで、問題を解決できました。

@app.route('/settings', methods=["GET","POST"])
def settings():
    """ show settings """
    provider = Provider.query.get(1)
    form = SettingsForm(request.form,obj=provider)

    if request.method == "POST" and form.validate():
        if provider:
            provider.rssfeed = form.rssfeed.data
            db.session.merge(provider)
            db.session.commit()
            flash("Settings changed")
            return redirect(url_for("index"))
        else:
            provider = Provider(form.rssfeed.data)
            db.session.add(provider)
            db.session.commit()
            flash("Settings added")
            return redirect(url_for("index"))
    return render_template("settings.html", form=form)
于 2012-07-03T08:27:00.707 に答える