2

显然有几个人有同样的 问题

不幸的是,他们都使用 PHP,这显然做了一些奇怪的事情。

我有一些看起来像这样的服务器代码:

@app.route("/place", methods=['GET', 'POST'])
def place():
    names = request.form.getlist('name')
    checks = request.form.getlist('checkboxes')
    if request.form.get('Add Element'):
        #return template with another form element and all the data
    #return default template with N copies of the input

现在问题来了 - 如果我使用单选按钮来表示是/否(选中与否),我不能使用getlist,因为它们都有相同的名称。或者,我不能使用复选框,因为出于某种原因,“他们”决定不应发送带有“假”值的复选框。

此解决方案不起作用:

<input id='testName' type='checkbox' value='Yes' name='testName'>
<input id='testNameHidden'  type='hidden' value='No' name='testName'>

因为,那么我想要的元素数量在 1-2 倍之间。

我不想使用 Javascript,尽管我可以轻松地使用 - 这将是一个使用率极低的网站(可能每月 200-300 次页面浏览量,最高,通常在月底聚集在一起)。

我有一个可能的解决方案是使用“YesNo”——但这似乎有点笨拙。不幸的是,我想不出任何其他方式(不涉及 javascript)来做我需要的事情。

我坚持select选择吗?

4

1 回答 1

6

未选中的复选框不会序列化为响应 - 如果您正在处理您有多个表单部分的情况,每个部分都有一个复选框(例如):

Repeating section #N
    Text field: __________
    Select field: -----------^
    Checkbox: []

Repeating section #N+1
    etc ...

然后你可以做两件事之一:

  • 为每个部分赋予其唯一的前缀或后缀 - 然后您可以检查响应中是否存在该特定值:

    if request.form.get("checkboxField#N", False):
        # Do something because the box is checked
    
  • 使用ImmutableOrderedMultiDict而不是ImmutableMultiDict您的表单容器(通过设置app.request_class为一个类并将其parameter_storage_class设置为 an ImmutableOrderedMultiDict):

    class OrderedParamContainer(flask.Request):
         parameter_storage_class = ImmutableOrderedMultiDict
    
    # some time later
    app.request_class = OrderedParamContainer
    

    这将使您能够按照浏览器提供给您的顺序遍历表单的键和值(在所有现有情况下,这与源代码中向浏览器提供表单元素的顺序相同) :

     def by_section(form):
         section = {}
         for key, value in enumerate(form):
             if key == "firstFieldName":
                 yield section
                 section = {}
             section[key] = value
    
         if section: yield section
    
于 2013-08-12T14:42:51.643 回答