Как реализовать пагинацию данных на сервере в приложении Django - PullRequest
0 голосов
/ 31 мая 2019

Мне нужна нумерация на стороне сервера + поиск в отдельном столбце для моего проекта 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)

1 Ответ

1 голос
/ 31 мая 2019

Сначала вы должны добавить:

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
...