【问题标题】:How to implement datatables server-side pagination in Django app如何在 Django 应用程序中实现数据表服务器端分页
【发布时间】:2019-10-17 03:59:38
【问题描述】:

我的 django 项目需要服务器端分页 + 单独的列搜索。可悲的是,我无法实现分页。

我搜索了很多工作示例,但没有找到。我想自己实现我的服务器端 api,有一些 django 应用程序,但它们似乎不再需要维护了。以下是我的数据表代码 + django 视图。这里有人可以给我一些建议吗?

var table = $('#mainTable').DataTable({
        dom: 'Bfrtip',
        responsive: true,
        serverSide: true,
        processing: true,
        pageLength: 25,
        buttons: [
            'csv', 'print',
            {
                extend: 'colvis',
                text: 'Spalten filtern',
                columns: ':not(.noVis)'
            },
        ],
        ajax: {
            url: '/akquise/mainTableData',
            dataSrc: function ( json ) {
                return json;
           }
        },
        columnDefs: [
            { targets: [0,1,2,3,4,5,6,7,8,9], orderable: false},
            { targets: 0, className: "leadID", searchable: false },
            { targets: 3, className: "firmenname" },
        ],
        columns: [
            { data: "leadID",
                render: function ( data, type, row, meta ) {
                    button = '<a role="button" class="btn btn-secondary" target="_blank" href="details?leadID='+data+'"><i class="fas fa-search"></a>';
                    return button
                }
            },
            { data: "leadID"},
            { data: "status",
                render: function ( data ) {
                    if(data == "Lead"){
                        return "<span class='badge badge-primary'>"+data+"</span>";
                    }
                    if(data == "Kunde"){
                        return "<span class='badge badge-info'>"+data+"</span>";
                    }
                    if(data == "Akquise"){
                        return "<span class='badge badge-warning'>"+data+"</span>";
                    }
                    if(data == "Lieferant"){
                        return "<span class='badge badge-success'>"+data+"</span>";
                    }
                    if(data == "Gesperrt"){
                        return "<span class='badge badge-danger'>"+data+"</span>";
                    }
                }
            },
            { data: "firmenname" },
            { data: "branche" },
            { data: "plz" },
            { data: "ort" },
            { data: "strasse" },
            { data: "telefon" },
            { data: "email" }
        ],
        language: {
                    "url": "//cdn.datatables.net/plug-ins/1.10.19/i18n/German.json",
                    "decimal": ",",
                }
    })

def mainTableData(request):
    search_values = []
    fields = ['leadID', 'status', 'firmenname', 'branche', 'plz', 'ort', 'strasse', 'telefon', 'email']
    for i in range(1, 10):
        value = request.GET.get('columns['+str(i)+'][search][value]')
        search_values.append(value)

    allLeads = Lead.objects.filter(reduce(AND, (Q(**{fields[i]+'__icontains': value} ) for i, value in enumerate(search_values)))).values('leadID', 'status', 'firmenname', 'branche', 'plz', 'ort', 'strasse', 'telefon', 'email')
    allLeads_list = list(allLeads)


    return JsonResponse(allLeads_list, safe=False)

【问题讨论】:

    标签: django datatables pagination


    【解决方案1】:

    首先你应该添加:

    from django.core.paginator import Paginator
    

    这是构建的功能服务器端分页。 试试这个:

    def mainTableData(request):
        search_values = []
        fields = ['leadID', 'status', 'firmenname', 'branche', 'plz', 'ort', 'strasse', 'telefon', 'email']
        for i in range(1, 10):
            value = request.GET.get('columns['+str(i)+'][search][value]')
            search_values.append(value)
    
        allLeads = Lead.objects.filter(reduce(AND, (Q(**{fields[i]+'__icontains': value} ) for i, value in enumerate(search_values)))).values('leadID', 'status', 'firmenname', 'branche', 'plz', 'ort', 'strasse', 'telefon', 'email')
    
        # Add paginator
        paginator = Paginator(allLeads, request.GET.get('page_length', 25)) # Show 25 contacts per page
    
        # Add option to read page
        page = request.GET.get('page')  # Add option in ajax or somewhere 
        allLeads_list = paginator.get_page(page) # Return objects list you can make json from this or list
    
        return JsonResponse(allLeads_list, safe=False)
    
    

    我添加了这一行,你可以在这里阅读更多信息(https://docs.djangoproject.com/en/2.2/topics/pagination/):

     # Add paginator
     paginator = Paginator(allLeads, request.GET.get('page_length', 25)) # Show 25 contacts per page
    
     # Add option to read page
     page = request.GET.get('page')  # Add option in ajax or somewhere 
     allLeads_list = paginator.get_page(page) # Return objects list you can make
    

    【讨论】:

    • 现在就像一个魅力!谢谢!我不知道我怎么能忽略 Django 自己的分页。
    • 谢谢你,我试过它会抛出global name 'AND' is not defined错误
    • 谢谢。出现错误:“未定义名称‘AND’”。
    • 你应该使用and_from operator import and_一样导入
    猜你喜欢
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2020-01-11
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多