1

そのため、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 はもっとクライアント側に焦点を当てています」ソース)。

私は追加のプラグインを使用することをためらっていませんが、データテーブルのデフォルトの機能を使用しています。どんな助けでも大歓迎です!

4

1 に答える 1

1

また、サーバー側の処理を含め、django でデータテーブルを使用しています。あなたが達成したいことの問題は、datatables自体がURLに対して非常に具体的なリクエストを行っており、テーブルを更新できるように特定のデータを期待していることです。

カスタムfnServerData関数を実装し、sMeow値を抽出して処理を実行し、データfnCallbackテーブルを更新するために委任することができます。sMeowただし、処理はクライアント側で行われるため (したがって、django テンプレートはありません)、JavaScriptの値のみを使用できます。

上記のリンクからコード例を直接取得します (少し追加します。コメントを参照してください)。

$(document).ready(function() {
    $('#example').dataTable( {
        "bProcessing": true,
        "bServerSide": true,
        "sAjaxSource": "../examples_support/server_processing.php",
        "fnServerData": function ( sSource, aoData, fnCallback ) {
            $.getJSON( sSource, aoData, function (json) { 
                var obj = JSON.parse(json);
                var smeow = obj['sMeow'];
                // do what you need with smeow
                fnCallback(json);
            });
        }
    });
});
于 2013-08-28T12:07:59.680 に答える