flask接收layui复选框提交数据的几种方法

由于前端页面的需求不一样,有些页面使用的layui的数据表格监听传递数据,有些则是使用分页模块自行编写的ajax提交方式,前者通过重载表格种的where条件添加参数来提交到后端进行数据的重新渲染,后者根据ajax写的方式有两种接收方法,真是实践了一下,写法稍有不通,后面传递的参数名也是不一样的

1.数据表格的重载方式,我的代码如下,主要是接收id复选框的值

htmL代码:

<div class="layui-inline" style="width: 300px;">
    <select name="id" id="id" lay-filter="id" multiple="multiple">
    {% for d in cas %}
        <option value="{{ d }}">{{ cas[d] }}</option>
    {% endfor %}
    </select>
</div>

js代码

var active = {
    reload: function(){
        var id = $("#id").val();
        var timeperiod = $("#timeperiod").val()
        table.reload('pyReload', {
            page: {
                curr: 1
            }
            ,where: {
                cid: cid,
                timeperiod: timeperiod
            }
        });
    }
};

复选框不选直接获取id的val()值为空时传递的值是null,有点选则是列表形式的,例如

["1","2","3"]

在flask接收的时候我们需要接收的方式如下,需要使用getlist方法接收所有复选框所有参数

id = request.args.getlist('cid[]')

这样接收id就是一个列表,但是不知道为什么list里面总是有重复的值,例如

["3","4","5","5"]

后来排查不是接口和下拉复选框的问题,问题出在where下面的重载条件,后面也具体查不出问题,只有用下面的技巧解决临时解决了,这样列表就变为一个字符串传递到后端

var active = {
    reload: function(){
        var id = $("#id").val();
        if(id == null){
            cid = '';
        }else{
            cid = id.join(",");
        }
        var timeperiod = $("#timeperiod").val()
        table.reload('pyReload', {
            page: {
                curr: 1
            }
            ,where: {
                cid: cid,
                timeperiod: timeperiod
            }
        });
    }
};

然后我接口改为(详细代码就不贴出来了,主要地方):

cid = request.args.get('cid')

if cid is None:
    cids = list(g.cas.keys())[:1]
elif cid == '':
    cids = list(g.cas.keys())
else:
    cids = [int(p) for p in cid.split(",")]

接收参数由原本的getlist方法改为普通的get方法

我的复选框使用的扩展插件下拉复选框,扩展模块可以在layui第三方组件平台查看https://fly.layui.com/extend/multiSelect/

2.模板引擎种自定义ajax的两种传参方式写法不一样然后后端接收到的参数名和值也不一样

1)我们直接来看ajax代码,我这里接收sid复选框的值

form.on('submit(alert_btn)', function(data){
    similaritys = $("#similaritys").val();
    sid = $("#sid").val()
    timeperiod = $("#timeperiod").val();
    load_data(1, similaritys, sid, timeperiod);
});

表单监听提交获取字段的值,原本可以直接通过参数data获取,但是咱们使用的下拉复选框是有点问题,只能通过选择器来获取到真实的值,可能是由于复选框隐藏添加的dom在表单外面的原因吧

load_data函数如下:

function load_data(curr, similaritys, sid){
        $.ajax({
            url:'{{ url_for("fp.ajaxAlert" ) }}?page='+curr+'&limit={{ page_limit }}&similarity='+similaritys+'&sid='+sid+'&timeperiod='+timeperiod,  
            type: 'GET',
  	    dataType: 'json',
            timeout: 3000,
  	        beforeSend: function(){
                var index = layer.load();
	        },
  	        error: function(){
  	        },
  	        success: function(json){
                layer.close(layer.index);
                //console.log(json);
                if(json.code == 0){
                    json.b = b;
                    var getTpl = show.innerHTML
                    ,view = document.getElementById('view');
                    laytpl(getTpl).render(json, function(html){
                        view.innerHTML = html;
                        element.render('similarity');
                    });
                    laypage.render({
                        elem: 'pages'
                        ,count: json.count
                        ,curr: curr
                        ,layout: ['count', 'prev', 'page', 'next', 'skip']
                        ,limit: "{{ page_limit }}"
                        ,jump: function(obj, first){
                            if(!first){
                                load_data(obj.curr, similaritys, sid, timeperiod);
                            }
                        }
                    });
                }else{
                    layer.alert('无法获取数据!');
                }
            }
        });
    }

咱们是使用的get方法提交表单,直接将数据值拼接到URL中,在flask接口接收的方法是

sid = request.args.get('sid')

if not sid or sid == "null":
    surs = list(g.surs) 
else:
    surs = [int(p) for p in sid.split(",")]

可以看到和上面数据表格重载的接收方式是一样的

2)另一种ajax的写法我们来看看有何不同,虽然是POST方法,但是我相信改成GET方式还是类似的,我们这里接收condition的复选框的值

    form.on('submit(retrive_btn)', function(data){
        var condition = $("#condition").val();
        var similaritys = $("#similaritys").val();
        var timeperiod = $("#timeperiod").val();
        $.ajax({
            url: '{{ url_for("fp.ajaxComparison") }}',
            data: {'condition':condition, 'timeperiod':timeperiod, 'similaritys':similaritys},
            type: 'POST',
  	    dataType: 'json',
            timeout: 5000,
            beforeSend: function(){
                var index = layer.load();
            },
            error: function(){
                layer.close(layer.index);
            },
            success: function(json){
                layer.close(layer.index);
                //console.log(json);
                if(json.code == 0){
                    laypage.render({
                        elem: 'pages'
                        ,count: json.data.length
                        ,limit: "{{ page_limit }}"
                        ,layout: ['count', 'prev', 'page', 'next', 'skip']
                        ,jump: function(obj){
                            ...something
                        }
                    });                
                }
            } 
        });
    });

接收的方法和我们之前的静态表格接收异常的接收方式一样,但是这个确是可以正常处理的,我们来看看接口的接收方法

condition = request.form.getlist('condition[]')
condition_list = []
    if not condition:
        for p in g.cameras:
            condition_list.append({"cid": str(p)+'@'+g.session_id})  
    else:
        for p in condition:
            condition_list.append({"cid": str(p)+'@'+g.session_id})
            datas2["retrieval"]["list"] = condition_list

我们可以猜出condition是一个列表,可以直接进行处理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/684.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。