不幸的是,他们都使用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
Run Code Online (Sandbox Code Playgroud)
现在这就是问题 - 如果我使用单选按钮作为我的是/否(选中或不选中),我就无法使用getlist,因为它们都有相同的名称.或者,我不能使用复选框,因为出于某种原因"他们"决定不应该使用"false"值发送复选框.
此解决方案不起作用:
<input id='testName' type='checkbox' value='Yes' name='testName'>
<input id='testNameHidden' type='hidden' value='No' name='testName'>
Run Code Online (Sandbox Code Playgroud)
因为,那么我想要的元素数量在1-2倍之间.
我不想使用Javascript,虽然我很容易 - 这将是一个使用率极低的网站(可能每月200-300页面浏览量,顶部,通常在月末聚集在一起).
我有一个可能的解决方案是使用"YesNo" - 但这似乎有点笨拙的一面.不幸的是,我不能轻易想到任何其他方式(不涉及javascript)来做我需要的.
我坚持select选择吗?
未经检查的复选框不会被序列化为响应 - 如果您正在处理一个案例,其中您有多个表单部分,每个部分都带有一个复选框(例如):
Repeating section #N
Text field: __________
Select field: -----------^
Checkbox: []
Repeating section #N+1
etc ...
Run Code Online (Sandbox Code Playgroud)
然后你可以做两件事之一:
为每个部分提供自己唯一的前缀或后缀 - 然后您可以检查响应中是否存在该特定值:
if request.form.get("checkboxField#N", False):
# Do something because the box is checked
Run Code Online (Sandbox Code Playgroud)使用ImmutableOrderedMultiDict,而不是ImmutableMultiDict为表单容器(通过设置app.request_class与它的类parameter_storage_class集合到一个ImmutableOrderedMultiDict):
class OrderedParamContainer(flask.Request):
parameter_storage_class = ImmutableOrderedMultiDict
# some time later
app.request_class = OrderedParamContainer
Run Code Online (Sandbox Code Playgroud)
这将使您能够按照浏览器提供给您的顺序迭代表单的键和值(在所有现有情况下,与源代码中向表单元素提供表单元素的顺序相同) :
def by_section(form):
section = {}
for key, value in enumerate(form):
if key == "firstFieldName":
yield section
section = {}
section[key] = value
if section: yield section
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2802 次 |
| 最近记录: |