django - 使用间隔的 AJAX 调用刷新模板中的 JSON 数据
Posted
技术标签:
【中文标题】django - 使用间隔的 AJAX 调用刷新模板中的 JSON 数据【英文标题】:django - refresh JSON data in the template with intervalled AJAX calls 【发布时间】:2016-03-24 02:46:05 【问题描述】:我已经检查了这个 *** topic ,但是这个 snippet 对我不起作用。我有一个错误:“模板”对象没有属性“节点列表”。 我的数据未显示在模板中。我的目标是刷新已渲染页面的数据,因此从模板更新单个块。 我的代码如下:
views.py:
def my_view(request):
if request.is_ajax():
my_data = MyObject.objects.all()
ctx = 'test': my_data.values()
return render(request, "temp.html", context=ctx)
提交 AJAX 请求后,我可以在 Chrome 控制台中看到我的 JSON 数据,但是该数据没有显示在模板中。
我的模板:
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
% for v in test %
v.path
% endfor %
<script>
window.setInterval(function()
$(document).ready(function()
$.ajax(
async: true,
type: "GET",
url: "/requests/",
);
);
, 2000);
</script>
我在 Chrome 控制台中看到 v.path 数据。
我的 json 数据结构如下:
[
"pk":4233,
"model":"hello.webrequest",
"fields":
"method":"GET",
"meta":"",
"user":null,
"is_secure":false,
"raw_post":"",
"user_agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36",
"host":"127.0.0.1:8765",
"path":"/requests/",
"cookies":"\"sessionid\": \"1t0ect4zsnfdh5ght7kqhmf3soezueg1\", \"csrftoken\": \"yLImX79fUFJD7kpGQCcfBZawwFtOUcFR\"",
"remote_addr_fwd":null,
"status_code":200,
"time":"2015-12-17T15:38:04.242Z",
"post":null,
"remote_addr":"127.0.0.1",
"get":null,
"uri":"http://127.0.0.1:8765/requests/",
"is_ajax":false
]
另外,我尝试过 HttpResponse,但它对我也不起作用
您能否提供一些 100% 的工作示例?
在这个主题Render JSON objects through Django template-tag 我找到了这样的建议:
如果 json 来自您自己的应用程序,您可以返回一个 html 片段而不是 json。
但我不太明白我该怎么做。
更新:我已经解决了我的问题。我拒绝使用 django 模板标签。而不是这个,我只是将 JSON 传递给 jQuery 脚本并生成所需的 html。
【问题讨论】:
您能否分享a
数据,看看它的样子以及是否显示任何错误消息?
将 JSON 添加到我的问题中
% for v in test %
仅在您有列表但您的数据不是列表时才有效,这就是它不起作用的原因,应该如下 [...,...]
抱歉,JSON 只是列表的一部分,再次更新问题
这里有很多 非常 奇怪的地方。为什么在视图中序列化为 JSON,然后在下一行将其加载回 Python?重点是什么?如果您有错误,您应该发布整个内容。
【参考方案1】:
用户render
不太复杂,使用render_to_response
,您将无法访问其他中间件的其他重要变量,最重要的是:用户、csrf_token 和消息。要让“render_to_response”传递所有这些参数,您必须添加一个“context_instance”。
def my_view(request):
if request.is_ajax():
my_data = MyObject.objects.all()
ctx = 'test': my_data.values()
return render(request, "temp.html", context=ctx)
如果您不扩展基础模板,请制作一个完整的模板:
<html>
<head>
<title></title>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
window.setInterval(function()
$(document).ready(function()
$.ajax(
async: true,
type: "GET",
url: "/requests/",
);
);
, 2000);
</script>
</head>
<body>
<ul>
% for v in test %
<li> v.fields.path </li>
% endfor %
</ul>
</body>
</html>
【讨论】:
我得到了与渲染相同的结果。将jQuery添加到我的问题中,也许脚本有问题 同样的结果,my_data.values() 只是稍微改变了 JSON 的格式。在 Chrome 控制台中,我看到了这个变量 v.some_field 的值,但页面仍然为空 可以分享整个模板吗? 你为什么使用async: true
和setInterval
?你的目的是什么?
我想每隔 n 秒从我的 api 获取一些数据并将其显示在我的页面上以上是关于django - 使用间隔的 AJAX 调用刷新模板中的 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章