【发布时间】: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页面并传递它还是有办法直接做?
标签: python json ajax django datatables