2016-10-26 6 views
1

Ich habe eine DataTable in einer HTML-Webseite initialisiert, stückweise durch Ajax Aufrufe an ein Django-Backend gerendert.DataTables Nächste Schaltfläche funktioniert nicht

Alles funktioniert gut, jedoch funktionieren die Datentabellen [Next] und [Last] nicht. Paginierung funktioniert gut, Prev und First funktionieren auch gut.

Datatable-Code:

var object_table = $('#object_table').DataTable({ 
    "sDom": '<"H"lfr>t<ip>', 
    "sPaginationType": "full_numbers", 
    "iOverlayFade": 100,  
    "processing": true, 
    "serverSide": true, 
    "ajax": '/objects/object_list/', 
    "deferRender": true 
    "aoColumnDefs": [ { "aTargets": [ 0 ], "sWidth": "1%", 
         "searchable":false, "orderable":false, } 
        ], 
"columns": function (row, data, index) {... }] 
}); 

Und das ist, was der Code aussieht, wie es von django auf den Datentabellen Ajax-Aufruf

def dt_object_list_loader: 
    r_sequence = int(request.GET.get('draw', 0)) 
    r_length = int(request.GET.get('length', 10)) 
    r_start = int(request.GET.get('start', 0)) 
    objects = djangomodel.objects.filter(...) 
    result_list = [objects[r_start:r_start + r_length] 
    response_data = {} 
    response_data['recordsTotal'] = len(result_list) 
    response_data['draw'] = int(request.GET.get('draw', 0)) 
    response_data['data'] = result_list 


    return HttpResponse(jsonpickle.encode(response_data), content_type='application/json') 

Paginierung funktioniert gut, und alle Last ohne Fehler übergeben wird. Aber ‚nächste/letzte‘ verschwimmen, und als ich sie klicken, django feuert den Fehler:

Internal Server Error: /home/task_list/ 
Traceback (most recent call last): 
.... 
r_start = int(request.GET.get('start', 0)) 
ValueError: invalid literal for int() with base 10: 'NaN' 

Tables feuert auch eine kryptische Fehlermeldung 7 (allgemeiner AJAX-Fehler), wenn der Python-Fehler führt (dies nicht Stellen Sie nichts außer der Tabelle, in der der Fehler aufgetreten ist.

Okay gut, so weiß ich, wenn nächste oder letzte angeklickt wird, ist der r_start Wert von der Databases-API NaN. Ich könnte normalerweise codieren, indem Sie nur den Bereich festlegen manuell, aber ich habe keine Möglichkeit von django zu wissen, welche Taste angeklickt wurde (Bereich für den letzten oder Bereich für den nächsten), ohne irgendeine inane jQuery zu machen

Diese Datatabelle wird fast genau von einem anderen Teil meines Programms kopiert und es funktioniert gut, ich habe gerade etwas vom Python-Code geändert, um eine andere Objektliste auszuspucken ... also bin ich ziemlich verwirrt, warum das kaputt geht.

Ich denke, meine Frage ist, wie kann ich Datendateien einen nützlicheren Wert auf "nächste" senden abgesehen von nur NaN übergeben und warum sind die nächsten/letzten Schaltflächen verschwommen?

Antwort

2

Sie müssen recordsFiltered Parameter zusätzlich zu recordsTotal zurückgeben.

response_data['recordsTotal'] = objects.count() 
response_data['recordsFiltered'] = objects.count() 

Da Sie keine Such recordsFiltered Parameterwert durchführen sollte recordsTotal gleich sein.

+1

Ich hatte eigentlich diese Codezeile, aber sie wurde auskommentiert. Was dies jedoch funktionierte, war die Gesamtlänge aller möglichen Ergebnisse, nicht nur die result_list (die nur einen Teil des gesamten Abfrage-Sets enthält). Also In diesem Beispiel habe ich response_data ['recordsFiltered'] = objects.count() Und das hat funktioniert. Diese Antwort ist meistens korrekt, wenn Sie sie in Objekte ändern können.count() Ich kann es akzeptieren. – rob

+1

@rob, ich weiß Python nicht, aber basierend auf Ihrer Beschreibung habe ich herausgefunden, dass 'recordsFiltered' fehlt. –

+0

Danke, du hast mir ein paar Stunden Kopfschmerzen erspart! – rob

1

Gryocodes Antwort war größtenteils korrekt.

Ich hatte RESPONSE_DATA kommentiert out [ 'recordsFiltered'] = len (result_list)

Aber wenn unkommentiert, das noch nicht funktioniert hat.

Ich reparierte diese durch

response_data['recordsFiltered'] = objects.count() 

Sofern Suchbegriffe zur Verfügung gestellt wurden Einstellung, wobei ich die Länge der gefilterten Objekte queryset zurückgegeben.

Verwandte Themen