不幸的是,他们都使用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"值。
<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
选项?
答案 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