4

複数の送信があるフォームがあるとします。

<form method="POST" action="/etc">
    <input name="foo" type="submit" value="Foo!">
    <input name="bar" type="submit" value="Bar!">
</form>

PHP でどの送信ボタンが押されたかを確認するには、次のように簡単です。

if (isset($_POST['foo'])) { return 'foo' }
if (isset($_POST['bar'])) { return 'bar' }

Python.Bottle に相当するものは何ですか?

私はもう試した:

if (request.POST.get('foo')):
    return 'foo'
if (request.POST.get('bar')):
    return 'bar'

しかし、これは KeyError を返します。これは、'foo' と 'bar' が POST dict にないことを意味します。

また、フォームにテスト フィールドを追加し、フォームが送信されたときにそのフィールドに値を返すことを試みましたが、それは完全に機能するため、フォームは投稿されています。

重要な点として、フォームの送信ボタンは動的に生成されます。

編集: 考えられる問題が見つかりました。jQueryを使用してフォームデータを投稿およびシリアル化していますが、明らかにjQueryのシリアル化は出力から送信ボタンを省略しているため、私が見ていることは間違いありません。現在、回避策に取り組んでいますが、引き続きご協力をお願いいたします。

4

2 に答える 2

2

問題は、jQueryのシリアル化関数が送信ボタンを無視することでした。

submitButton関連するすべての送信ボタンにクラス(例では)を追加theHiddenInputし、フォームに非表示の入力(例では)を追加してから、次のハンドラーを追加することで、これを回避しました。

$('.submitButton').click(function() {
    this.form.theHiddenInput.value = this.name;
});

次のコードは、以前のコードと同等です。

if (request.POST.get('theHiddenInput') == 'foo'):
    return 'foo'
if (request.POST.get('theHiddenInput') == 'bar'):
    return 'bar'

多分これは将来誰かを助けるでしょう。

于 2012-11-01T11:39:25.233 に答える
2

enctype="multipart/form-data"フォームに追加してみてください。

<form action="/etc" method="post" enctype="multipart/form-data">
    <input name="foo" type="submit" value="Foo!">
    <input name="bar" type="submit" value="Bar!">
</form>

ボトルのドキュメントによると:

BaseRequest.forms

url-encodedまたはmultipart/form-data エンコードされたボディPOSTまたはPUTリクエストボディから解析されたフォーム値。結果は として返されます FormsDict。すべてのキーと値は文字列です。ファイルのアップロードは に個別に保存されfilesます。

BaseRequest.POST

との値を 1 つのformsfiles結合しFormsDictます。値は文字列 (フォームの値) または cgi.FieldStorage(ファイルのアップロード) のインスタンスです。

于 2012-11-01T09:31:29.903 に答える