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: truesetInterval?你的目的是什么? 我想每隔 n 秒从我的 api 获取一些数据并将其显示在我的页面上

以上是关于django - 使用间隔的 AJAX 调用刷新模板中的 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

Django动态表与AJAX

使用 AJAX 自动刷新在 Web 应用程序上超时会话的方法

在引导下拉列表中使用 django 进行 Ajax 调用

使用 AJAX 刷新 Django 动态 HTML 表

Django使用Ajax实现页面无刷新评论回复功能

如何在 Django 中使用 AJAX 从 html 中正确调用函数/url?