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 字典中。

我还尝试在表单中添加一个测试字段,并在提交表单时返回该字段中的值并且效果很好,因此表单正在发布。

一件事可能很重要:表单中的提交按钮是动态生成的。

编辑:发现一个可能的问题。我正在使用 jQuery 发布和序列化表单数据,但显然 jQuery 的序列化忽略了输出中的提交按钮,这肯定会导致我所看到的。目前正在研究解决方法,但仍然感谢任何帮助。

4

2 回答 2

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 编码POSTPUT请求正文中解析的表单值。结果被重新调整为 FormsDict. 所有键和值都是字符串。文件上传单独存储在files.

BaseRequest.POST

forms和的值files组合成一个FormsDict. 值可以是字符串(表单值)或 cgi.FieldStorage(文件上传)的实例。

于 2012-11-01T09:31:29.903 回答
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 回答