zoukankan      html  css  js  c++  java
  • 在web.py中处理表单中的多选下拉框

    web.py是 一个轻量级的web framework,源代码只有7000多行(我自己用wc -l计算,肯定偏多了),用它来做个简单的站点很方便,上手容易。我在公司就用web.py做了我们自己的自动化测试管理工具,主要是管理自动化用例,展 示测试结果。最近遇到一个问题,我想做一个多选下拉框,但是等我做完以后发现结果跟我预想的不太一样。

    我用的是web.py的web.form.Dropdown类来生成一个多选下拉框。只需在初始化dropdown的时候传一个multiple=”参数就OK了

    form.Dropdown(‘adserver_id’, description=’Adserver: ‘, args=ADSERVERS, multiple=”)

    这样生成的html就是

    <select name="adserver_id" id="adserver_id" multiple="">   <option value="1">Coretest2 - 1</option>   <option value="2">Coretest3 - 1</option>   <option value="3">Coretest4 - 1</option>   <option value="4">Coretest2 - 2</option>   <option value="5">Coretest3 - 2</option>   <option value="6">Coretest4 - 2</option> </select>

    不过当我选中多个选项提交表单的时候,我在服务端得到的结果却是最后一个选中的选项,例如我选了Coretest2 – 1和Coretest3 – 1,那么我在服务端拿到的数据就只有Coretest3 – 1。用Firebug抓了一下请求看,原来POST的数据是长这个样子的:

    adserver_id: 1
    adserver_id: 2

    在web.py中,一般是通过web.input()来获取表单提交的数据。而web.input()会把所有提交的数据给storify方法处理 一下(可以更容易的访问dict的数据,例如原来是mydict['name'],可以写成mydict.name),而这个方法默认会把 adserver_id处理成唯一的key,所以无论输入是多少个adserver_id,最终拿到的只有1个。解决方法很简单,用这个方法来获取 post的数据web.input(adserver_id=[]),这样提交adserver_id的多个数据就会被保存到一个列表里面了。

    但是这时候会遇到另一个问题,就是如果想要更改这个case的时候,就没有办法在web.py里面用 value=xxx 来指定哪些options是应该被选中的。value=xxx只能指定一个option,怎么办?我是用了JavaScript来解决。思路很简单,就是 页面Load完以后,JavaScript获取一下哪些options应该被选中,然后就选上那些项,OK

  • 相关阅读:
    java面试-synchronized底层实现机制
    java面试-内存分配与回收策略
    java面试-对象的创建、内存布局、访问定位
    推荐算法-余弦相似度
    推荐算法-欧几里得距离
    MySQL总结
    MySQL事务
    MySQL-一条sql语句的执行顺序
    mysql 表格操作指令大全(Show、desc、create、insert into、delete、select、drop、update、alter)
    mysql 创建数据数据库 (避免新建的库名已经存在、设置编码)
  • 原文地址:https://www.cnblogs.com/shihao/p/2325238.html
Copyright © 2011-2022 走看看