そのため、django サーバー側処理を使用して dataTables プラグインを実装しました。次のように見えます。
テンプレート:
<script type="text/javascript">
$(document).ready(function() {
$('#example').dataTable( {
"bProcessing": true,
"bServerSide": true,
"sAjaxSource": "/datatable/"
} );
} );
</script>
ビュー:
def main_view(request):
return render_to_response('index.html')
def datatables_view(request):
start = request.GET['iDisplayStart']
length = request.GET['iDisplayLength']
query = myUser.objects.all()
total = query.count()
if request.GET.has_key('sSearch'):
# filtering...
query = query[start:start+length]
response = {"aaData": [(q.name, q.state, q.email) for q in query],
"iTotalRecords": total,
...additional params for dataTable... }
次に、json.dump を使用してデータをシリアル化し、そのように送信します
s = json.dump(response)
return HttpResponse(s.read())
これは少し間違っているかもしれませんが、それは実際のコードを使用しているのではなく、メモリから書き留めているためです。ここで間違いがあったとしても、これが一般的な考えであることを理解することは重要ではありません... (また、simplejson が廃止された django 1.5 でこれを実行しているため、json を使用します)。
私が言ったように、これはうまくいきます。ページの URL は main_view で機能し、datatables はその ajax 呼び出しを datatables_view に送信し、すべてが動作します。ここで、サーバーから(サーバーではなく)追加のデータを送信したいと考えています。のように、テンプレート内で使用するデータを追加したいと思います。このデータは、現在のクエリに依存し、動的である必要があるため、datatables_view から取得する必要があります。これを応答に追加するとします。
response = {"aaData": [(q.name, q.state, q.email) for q in query],
"iTotalRecords": total,
...additional params for dataTable...,
"sMeow": query.filter(name='cat')[:20]}
これは明らかに一例ですが、要点は、クエリを変更すると (検索語でフィルタリングしたり、順序を変更したりするなど)、sMeowも変更されるということです。そして、テンプレートで何らかの方法でアクセスしたいと思います。明らかに、私はこれを行うことはできません:
{{ sMeow }}
しかし、これはドキュメントが受け取るものではなく、データテーブルが受け取るものであり、API を使用してアクセスする必要があるため、parseJSONも使用できませんが、その方法がわかりません。
最終的には、sMeow の値に対して何らかのスクリプトを実行する (そしてそれを別のリクエストに送信する) ボタンが必要になるので、tabletools プラグインを調べましたが、サーバー側ではうまく機能しません (「TableTools はもっとクライアント側に焦点を当てています」ソース)。
私は追加のプラグインを使用することをためらっていませんが、データテーブルのデフォルトの機能を使用しています。どんな助けでも大歓迎です!