如何使用Flask获取未选中的复选框? (或者其他的东西!)

时间:2013-08-10 11:40:04

标签: html forms flask

显然有几个人拥有same problem

不幸的是,他们都使用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,因为他们都已获得了一样的名字。或者,我无法使用复选框,因为出于某种原因"他们"我决定不应该发送复选框,而不是" false"值。

This solution无效:

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

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

我不想使用Javascript,但我很容易 - 这将是一个使用率极低的网站(每月可能有200-300页的浏览量,顶部,通常在月末聚集在一起)。

我有一个可能的解决方案是使用“YesNo&#39; - 但这似乎有点笨重的一面。不幸的是,我不能轻易想到任何其他方式(不涉及javascript)来做我需要的事情。

我是否坚持使用select选项?

1 个答案:

答案 0 :(得分:5)

未经检查的复选框不会被序列化到响应中 - 如果您正在处理一个案例,其中您有多个表单部分,每个部分都带有一个复选框(例如):

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设置为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