Datatables Ajax 在从文件中读取 JSON 时起作用,但从变量中读取 JSON 时不起作用(Django)

Posted

技术标签:

【中文标题】Datatables Ajax 在从文件中读取 JSON 时起作用,但从变量中读取 JSON 时不起作用(Django)【英文标题】:Datatables Ajax works when reading JSON from file, but not from variable (Django) 【发布时间】:2017-05-08 01:10:06 【问题描述】:

我已经被这个问题困扰了几天了。我正在尝试将 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" ,
            ]
     );
 );

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"]

当我使用 django 传递变量 suppliers_all 浏览器调试返回 a 404 not found error。我尝试根据网站示例对 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),

【问题讨论】:

嗯,你得到一个 404,因为你的上下文变量不是真正的 URL 资源,而 ajax 认为它是一个实际的 URL。 我想这是有道理的,但是有没有办法将它传递给变量?所有示例始终具有指向文件的链接。我需要生成单独的url页面并传递它还是有办法直接做? 【参考方案1】:

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

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

【讨论】:

我试过了,但是没有用。表会加载空,我会得到incorrect parameter error。我在' suppliers_all ' 中添加了逗号,否则会出现语法错误。我设法通过使用 JSON 输出创建新视图和 url 然后将 Ajax 链接到它来解决问题,但这仍然是多余的解决方案。 谢谢。我再次查看更多细节,并意识到我遇到的问题是因为 Django 渲染在生成模板时自动转义了单个逗号,这就是为什么 JSON 解析在我之前尝试时对我不起作用的原因 很高兴您找到了解决方案 :)

以上是关于Datatables Ajax 在从文件中读取 JSON 时起作用,但从变量中读取 JSON 时不起作用(Django)的主要内容,如果未能解决你的问题,请参考以下文章

数据表:未捕获的类型错误:无法读取未定义的属性“长度”

如何加快IE8中innerHTML的读取速度?

如何使用 ajax-datatables-rails 理解 Rails 中的包含

datatables jquery - 未捕获的类型错误:无法读取未定义的属性“显示”

DataTables 警告:table id=dataTables - Ajax 错误。 404 未找到

未捕获的TypeError:无法读取未定义数据表的属性“长度”