2016-10-26 8 views
1

DataTableをHTML Webページで初期化し、Djangoバックエンドへのajax呼び出しによって区分的にレンダリングしました。DataTables次のボタンが機能しない

すべてがうまくいっていますが、[次へ]と[最後]のデータ可能なボタンは機能しません。改ページはうまく動作し、PrevとFirstも正常に動作します。

のDataTableコード:

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) {... }] 
}); 

そして、これは、ページネーションがエラーなしで正常に動作し、すべての負荷それはDataTableのAJAX呼び出しにジャンゴから渡されたように、コードがどのように見えるか

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') 

です。これはしていません(Pythonのエラーがスローされたときに

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' 

DataTableのも不可解なエラー7(一般的なAjaxのエラー)を発生させます。しかし、「最後の/次の」ぼやけている、と私はそれらをクリックすると、Djangoはエラーを発生させますエラーが発生したテーブル以外のものを提供してください。

次回または最後にクリックされたときに、datatables APIから提供されるr_start値がNaNであることがわかりました。私はいくつかの不器用なjqueryを実行することなく、どのボタンがクリックされたか(最後の範囲か、次の範囲)をdjangoから知る方法がありません。

このデータテーブルは、私のプログラムの別の部分からほぼ正確にコピーされ、うまくいきました。私はちょうど別のオブジェクトリストを吐くようにPythonコードを変更しました。

私の質問は、データ型をNaNを渡すだけでなく、次の/最後のボタンがぼやけているのを除いて、「次へ」にもっと有用な値を送るようにするにはどうすればいいですか?

答えて

2

recordsTotalに加えて、recordsFilteredパラメータを返す必要があります。

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

あなたが実行していないので、検索recordsFilteredパラメータ値はrecordsTotalに等しいはずです。

+1

私は実際にこのコード行を持っていましたが、コメントアウトされました。 しかし、この作業は、result_list(クエリーセット全体のチャンクのみを含む)だけでなく、すべての可能な結果の合計長を使用していました。 この例では、response_data ['recordsFiltered'] = objects.count()を使用しました。 これはうまくいきました。あなたがオブジェクトに変更することができれば、この答えはほとんど正しいです。count()私はそれを受け入れることができます。 – rob

+1

@rob、私はPythonを知らないのですが、あなたの記述に基づいて、 'recordsFiltered'が見つからなかったとわかりました。 –

+0

ありがとう、あなたは頭痛の数時間私を救った! – rob

1

グリココードの答えは大抵正しいものでした。

私は response_data [ 'recordsFiltered'] = LEN(result_list)

しかし、コメントのない、これはまだ動作しませんでしたをコメントアウトしていました。

Iは、検索用語がIを濾過オブジェクトクエリセットの長さを戻った場合には、提供された場合を除き

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

を設定することによって、これを固定しました。

関連する問題