django的动态生成表格分页加搜索

根据之前案例合并了视图

def flow_list(request):
    # 获取搜索及分页参数
    search_params = {
        # 获取input的name=""传过来的值
        'page': int(request.GET.get('page', 1)),  
        'limit': int(request.GET.get('limit', 10)),
        'start': request.GET.get('start'),  
        'end': request.GET.get('end'),
        'phone_number': request.GET.get('phone_number'),
        'qq_number': request.GET.get('qq_number'),
        'wechat_id': request.GET.get('wechat_number'),
    }

    # 模糊搜索
    q_objects = Q()

    if search_params['start']:
        q_objects &= Q(enrollment_time__gte=search_params['start'])
    if search_params['end']:
        q_objects &= Q(enrollment_time__lte=search_params['end'])

    # 对于字符串类型字段,使用icontains进行模糊搜索
    for field_name in ['phone_number', 'qq_number', 'wechat_id']:
        field_value = search_params.get(field_name)
        if field_value:
            q_objects &= Q(**{field_name + '__icontains': field_value})

    if search_params['traffic_owner']:
        q_objects &= Q(traffic_owner__work_id=search_params['traffic_owner'])

    # 根据搜索条件构建查询集
    queryset = models.FlowList.objects.all().order_by('-id')
    queryset = queryset.filter(q_objects)

   


    # 判断是否为ajax请求
    is_ajax = request.headers.get('X-Requested-With') == 'XMLHttpRequest'

    # 判断请求类型
    if is_ajax:
        # 对查询集进行分页
        paginator = Paginator(queryset, search_params['limit'])

        try:
            page_obj = paginator.page(search_params['page'])
        except EmptyPage:
            page_obj = paginator.page(1)
        except InvalidPage:
            page_obj = paginator.page(1)

        # 转换为值列表
        data_list = list(page_obj.object_list.values(
            'id', 'phone_number', 'qq_number', 'wechat_id', 'traffic_source', 'subject', 'enrollment_time',
            'traffic_owner__nickname', 'creator__nickname', 'update_time'
        ))

        # 创建响应数据字典
        response_data = {
            'code': 0,
            'msg': 'success',
            'data': data_list,
            'count': paginator.count,
            'current_page': page_obj.number,
            'per_page': search_params['limit'],
            'total_pages': paginator.num_pages,
        }

        return JsonResponse(response_data)

    else:
        context = {
            "form": form,
        }

        return render(request, "flow-list.html", context)

html:

<form class="layui-form layui-col-space5" lay-filter="searchForm">
    <div class="layui-inline">
        <div class="layui-inline" id="ID-laydate-rangeLinked" layui-laydate-id="ID-laydate-rangeLinked">
            <div class="layui-input-inline">
                <input type="text" autocomplete="off" id="ID-laydate-start-date-1" class="layui-input"
                    placeholder="开始日期" name="start">
            </div>
            <div class="layui-input-inline">
                <input type="text" autocomplete="off" id="ID-laydate-end-date-1" class="layui-input" placeholder="结束日期"
                    name="end">
            </div>
        </div>
    </div>
    <div class="layui-inline layui-show-xs-block">
        <input type="text" name="phone_number" placeholder="请输入手机号" autocomplete="off" class="layui-input">
    </div>
    <div class="layui-inline layui-show-xs-block">
        <input type="text" name="qq_number" placeholder="请输入QQ" autocomplete="off" class="layui-input">
    </div>
    <div class="layui-inline layui-show-xs-block">
        <input type="text" name="wechat_number" placeholder="请输入微信号" autocomplete="off" class="layui-input">
    </div>
  
    <div class="layui-inline layui-show-xs-block">
        <button class="layui-btn layui-btn-normal" id="search-btn">
            <i class="layui-icon">&#xe615;</i>
        </button>
    </div>
</form>



 <div class="layui-card-body layui-table-body layui-table-main">
    <table id="demo" lay-filter="test"></table>
</div>

js:

 <script>
        layui.use(['table', 'form'], function () {
            var table = layui.table;
            var form = layui.form;



            // 初始化表格并设置列配置
            table.render({
                elem: '#demo'
                , url: '/flow/list/'
                , where: {}  //设置空的在下面拼接ulr
                , toolbar: true
                , page: true
                , limit: 10
                , limits: [10, 20, 30]
                , unresize: true
                , cols: [[
                    { field: 'id', title: 'ID', width: 80, sort: true, fixed: 'left'},
                    //填写 需要显示的数据        
                ]]
            });

            // 监听表单提交事件  
            form.on('submit(searchForm)', function (data) {
                var searchParams = {
                    start: $('[name="start"]').val(),
                    end: $('[name="end"]').val(),
                    phone_number: $('[name="phone_number"]').val(),
                    qq_number: $('[name="qq_number"]').val(),
                    wechat_number: $('[name="wechat_number"]').val(),
                    traffic_owner: $('[name="traffic_owner"]').val(),
                };

                // 重载表格时清除当前页码,从第一页开始搜索
                table.reload('demo', {
                    where: searchParams,
                    page: { curr: 1 }
                });

                return false; // 阻止表单提交
            });
            // 给搜索按钮添加表单提交事件
            $('#search-btn').on('click', function () {
                form.submit('searchForm'); // 触发表单提交  
            });
        });
    </script>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值