2016-12-22 13 views
2

私はこの問題を数日前から抱えていました。私はDataTableにJSONデータをフィードしようとしていますが、ソースとして静的ファイルを使用する場合にのみ機能します(下記のindex.htmlを参照)。Datatables AjaxはJSONをファイルから読み込んだり、変数(Django)から読み込んだりしません

index.htmlを

$(document).ready(function() { 
    $('#mydata').DataTable({ 

      "ajax": { 
      "url": '{% static "myapp/supplier.json" %}', //<= works 
{#     "url": '{{ suppliers_all }}',#}  //<=does not work 
      "dataSrc": "" 
      }, 
      "columns": [ 
       { "data": "name" }, 
       { "data": "classification" }, 
      ] 
    }); 
}); 

views.py

def index(request): 
    suppliers_all = Supplier.objects.all().values('name', 'classification') 
    suppliers_all = json.dumps(list(suppliers_all)) 
    context = {'suppliers_all': suppliers_all, 
       } 
    return render(request, 'myapp/index.html', context) 

JSON出力:

[{"classification": "Base Supplier", "name": "Supplier Name1"}, {"classification": "Strategic Supplier", "name": "Supplier Name2"}] 

私はジャンゴを使用

は、変数 {{ suppliers_all }}ブラウザのデバッグを通過したが a 404 not found errorを返します。 Webサイトの例に従ってJSON出力をハードコーディングしてみましたが、さまざまな方法で試しましたが、ファイルから直接取り出されないとうまくいかないでしょう。

更新:JSONのHttpResponseと新しいビューを作成することによって、 解決の問題とURL

def supjson(request): 
    suppliers_all = Supplier.objects.all().values('name', 'classification') 
    suppliers_all = json.dumps(list(suppliers_all), cls=DjangoJSONEncoder) 
    context = {'suppliers_all': suppliers_all, 
    return HttpResponse(suppliers_all, content_type='application/json') 

そして、次へAjaxのURLを変更:

    "ajax": { 
        "url": '{% url 'myapp:supjson' %}', 
        "dataSrc": "" 
        }, 

それは動作しますが、私はそれが冗長だと感じ私は変数を介してデータを直接渡すという問題があります。

更新#2:問題はDjangoが1つのカンマを自動作成したためにJSON構文解析が機能しなくなったためです。私は次のように変更しました:

を追加しましたmark_safe views.pyで

context = {'suppliers_all': mark_safe(suppliers_all), 
      } 

文字列化JSONをして、index.htmlのテンプレートでそれを解析さ:

$(document).ready(function() { 
var json=JSON.stringify({{ suppliers_all }}); 
    $('#mydata').DataTable({ 
      "data": JSON.parse(json), 
+0

コンテキスト変数が実際にURLリソースではなく、ajaxが実際のURLと考えているため、404が表示されます。 –

+0

私はそれが理にかなっていると思いますが、それを変数に渡す方法はありますか?すべての例は、常にファイルへのリンクを持っています。別のURLページを生成して渡す必要があるのですか、それとも直接行う方法がありますか? – Trm

答えて

0

おそらく、あなたがする必要はありませんURLからデータを読み込みます。データが事前にロードされている場合は、DataTableに直接追加してください。

$(document).ready(function(){ 
    $('#mydata').DataTable({ 
     "data": JSON.parse('{{ suppliers_all }}'), 
     "columns": [ 
      {"data": "name"}, 
      {"data": "classification"}, 
     ] 
    }); 
}); 
+0

私はそれを試みたが、うまくいかなかった。テーブルが空に読み込まれ、[不正なパラメータエラー](https://datatables.net/manual/tech-notes/4)が表示されます。私はカンマを '' {{suppliers_all}} ''に追加しました。そうでなければ、構文エラーが発生します。私は新しいビューを作成し、JSON出力でURLを作成し、それにAjaxをリンクするだけで問題を解決することができましたが、それでもまだ冗長な解決策を感じています。おかげさまで – Trm

+0

私はもう一度詳細を探していましたが、Djangoがテンプレートを生成するときにDjangoが自動的にエスケープされた単一のカンマをレンダリングするため、JSON解析が以前に私のためにうまくいかなかった理由を理解しました – Trm

+0

嬉しいです:) – Chikiro

関連する問題