You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Ajax的jQuery DataTables分页Django后端实现求助

我完全懂你的困扰——DataTables官方用PHP的SSP类做示例,对Django开发者来说确实有点隔靴搔痒,别慌,我一步步带你在Django里实现服务端分页,把那些让人懵的参数都讲透。

第一步:调整前端DataTables配置

首先你需要完善前端代码,确保开启服务端处理,并且让DataTables自动发送分页相关参数:

$('#results').dataTable({
  "serverSide": true, // 核心:开启服务端分页模式
  "pageLength": 10, // 每页默认加载10条
  "ajax": {
    "url": "get_intl_tickets",
    "type": "POST",
    "data": function(d) {
      // 把自定义参数和DataTables自动生成的分页/搜索参数合并
      d.csrfmiddlewaretoken = csrftoken;
      d.user_id = 451;
    }
  }
});

当serverSide: true时,DataTables会自动给后端发送一堆参数,比如draw(请求标识)、start(当前页起始数据索引)、length(每页条数)、search[value](搜索关键词)等,用函数式的data可以把你的自定义参数(user_id、csrf token)和这些参数一起传给后端。

第二步:Django后端视图实现

接下来写后端的视图函数,处理前端的请求并返回符合DataTables要求的JSON格式数据。假设你的票务模型是IntlTicket:

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import IntlTicket  # 替换成你的实际模型

@csrf_exempt  # 如果已经通过前端传递了csrf token,也可以用@csrf_protect
def get_intl_tickets(request):
    if request.method == 'POST':
        # 1. 提取DataTables发送的核心参数
        draw = int(request.POST.get('draw', 1))  # 请求标识,要原封不动返回
        start = int(request.POST.get('start', 0))  # 当前页起始索引
        length = int(request.POST.get('length', 10))  # 每页条数
        search_keyword = request.POST.get('search[value]', '')  # 搜索关键词
        
        # 2. 基础数据查询:根据user_id筛选
        queryset = IntlTicket.objects.filter(user_id=451)
        
        # 3. 处理搜索过滤(可选,根据你的需求添加)
        if search_keyword:
            queryset = queryset.filter(
                # 这里替换成你的模型实际字段,比如搜索票务标题、编号
                title__icontains=search_keyword | 
                ticket_number__icontains=search_keyword
            )
        
        # 4. 计算总记录数和过滤后的记录数
        total_records = IntlTicket.objects.filter(user_id=451).count()  # 所有符合user_id的记录数
        filtered_records = queryset.count()  # 经过搜索过滤后的记录数
        
        # 5. 分页截取数据:跳过start条,取length条
        page_data = queryset[start:start+length].values()  # 用values()返回字典格式,方便转JSON
        
        # 6. 构造DataTables要求的响应格式
        response_data = {
            'draw': draw,
            'recordsTotal': total_records,
            'recordsFiltered': filtered_records,
            'data': list(page_data)
        }
        
        return JsonResponse(response_data)
    return JsonResponse({'error': '仅支持POST请求'}, status=400)
关键参数解释(终于搞懂它们的作用了!)
  • draw: DataTables每次请求都会发一个唯一的标识号,后端必须原封不动返回,用来匹配请求和响应,避免因为网络延迟导致的响应乱序。
  • recordsTotal: 所有符合基础条件(这里是user_id=451)的总记录数,不管分页和搜索,用来展示“共X条”的总数量。
  • recordsFiltered: 经过搜索过滤后的总记录数,如果没有搜索,就等于recordsTotal,用来展示搜索后的“共X条”。
  • data: 当前页要展示的具体数据列表,转成Python列表后,JsonResponse会自动转成JSON数组。
可选:添加排序功能

如果需要支持点击表头排序,DataTables会发送order[0][column](排序的列索引)和order[0][dir](排序方向:asc/desc),你可以在视图里添加排序逻辑:

# 在处理搜索之后添加排序逻辑
order_col_index = int(request.POST.get('order[0][column]', 0))
order_dir = request.POST.get('order[0][dir]', 'asc')
# 假设前端列对应的模型字段顺序是:['title', 'ticket_number', 'create_time']
columns_map = ['title', 'ticket_number', 'create_time']
sort_field = columns_map[order_col_index]
if order_dir == 'desc':
    sort_field = f'-{sort_field}'  # 降序加负号
queryset = queryset.order_by(sort_field)

内容的提问来源于stack exchange,提问作者Shyamkkhadka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:17:34