Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Datatables Ajax在从文件读取JSON时工作,但不从变量(Django)读取JSON时工作_Python_Json_Ajax_Django_Datatables - Fatal编程技术网

Python Datatables Ajax在从文件读取JSON时工作,但不从变量(Django)读取JSON时工作

Python Datatables Ajax在从文件读取JSON时工作,但不从变量(Django)读取JSON时工作,python,json,ajax,django,datatables,Python,Json,Ajax,Django,Datatables,我已经被这个问题困扰了好几天了。我试图将JSON数据馈送到DataTables,但它只有在使用静态文件作为源时才起作用(请参见下面的index.html) index.html $(document).ready(function() { $('#mydata').DataTable( { "ajax": { "url": '{% static "myapp/supplier.json" %}', //<= works {#

我已经被这个问题困扰了好几天了。我试图将JSON数据馈送到DataTables,但它只有在使用静态文件作为源时才起作用(请参见下面的index.html)

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" },
            ]
    } );
} );
JSON输出:

[{"classification": "Base Supplier", "name": "Supplier Name1"}, {"classification": "Strategic Supplier", "name": "Supplier Name2"}]
当我使用django传递的变量
{{suppliers\u all}}
时,浏览器调试返回。我尝试根据网站示例对JSON输出进行硬编码,尝试了许多不同的方法,但如果不直接从文件中获取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自动转义单个逗号导致JSON解析无法工作。我做了以下更改:

在views.py中添加了mark_safe

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

也许您不需要从url加载数据。如果您的数据已预加载,请尝试将其直接添加到DataTable

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

好吧,你得到的是404,因为你的上下文变量不是一个真正的URL资源,ajax认为它是一个实际的URL。我想这是有道理的,但是有没有办法在变量中传递它呢?所有示例都有指向文件的链接。我是否需要生成单独的url页面并传递它,或者有没有直接执行的方法?我已经尝试过了,但没有成功。桌子会空的,我会得到。我在
'{{suppliers\u all}}}
中添加了逗号,否则会产生语法错误。我通过使用JSON输出创建新的视图和url,然后将Ajax链接到它,成功地解决了这个问题,但这仍然是一个多余的解决方案。谢谢。我再次查看了更多的细节,并意识到我遇到的问题是因为Django render在生成模板时自动转义了单个逗号,这就是为什么我之前尝试使用JSON解析时发现JSON解析不起作用的原因:)
$(document).ready(function(){
    $('#mydata').DataTable({
        "data": JSON.parse('{{ suppliers_all }}'),
        "columns": [
            {"data": "name"},
            {"data": "classification"},
        ]
    });
});