0

そのため、ユーザーがフォーム内の以前のデータを編集できるようにする編集ボタンを使用して、WTForms でフォームを作成しました。

私が抱えている問題は、フォームから新しいデータをフェッチすることです.request.formを実行すると、次のようになります:

ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')])

私が欲しいのは、上記の出力から以下を取得することです

('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')])
4

2 に答える 2

1

あなたはすでに WTForms でフォーム クラスを書き出す作業を行っています (そして、CSRF を意図的に使用していない限り、crsf_token が通常そこにないことを考えると、Flask-WTF を疑っています)。

つまり、すでに次のようなことを行ったことを意味します。

class MyForm(Form):
    feed_url = TextField(...)
    # etc

そして、あなたはすでに次のようなことをしました

def my_view():
    form = MyForm(request.form)
    render('mytemplate.html', form=form)

この素晴らしいフォーム オブジェクトができたので、それを使用してください。つまり、form.dataまたはform.feed_url.dataデータ型強制データを含むデータにアクセスします。さらに、wtforms で検証ロジックを使用して、不正なデータがないことを確認できます。request.formフレームワークからの生の入力である whichを使用する理由はありません。

これにより、次のような結果が得られます (これは架空の疑似フレームワークの一般的な例であり、フレームワークに適切な呼び出し名を取得する必要があることに注意してください)。

def edit_location(location_id):
    my_object = LocationInfo.get(location_id)
    form = MyForm(request.form, obj=my_object)
    if request.form and form.validate():
        # If we got here, we have POST data and the form validated.
        form.populate_obj(my_object) # Super cool magic!
        my_object.save()
        return redirect(...)

    # If we fall back to here, it means validation failed or we're
    # viewing the form for the first time.
    render('mytemplate.html', form=form)

WTForms のクラッシュ コースとそこにある他のドキュメントを読んで、WTForms の使用方法をよりよく理解することをお勧めします。

于 2013-07-26T23:25:10.217 に答える
0

リスト内包表記を使用して、csrf_tokens を除外できます。

>>> import werkzeug
>>> i = werkzeug.ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')])
>>> i
ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')])
>>> keys = ['location_name', 'feed_url', 'title', 'url', 'date_crawled', 'content_url', 'longitude', 'latitude', 'date_added', 'types']
>>> data = [(key, i[key]) for key in i if key in keys]
>>> data
[('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')]
>>> 
于 2013-07-02T21:57:37.687 に答える