【问题标题】:django - refresh JSON data in the template with intervalled AJAX callsdjango - 使用间隔的 AJAX 调用刷新模板中的 JSON 数据
【发布时间】:2016-03-24 02:46:05
【问题描述】:

我已经检查了这个 stackoverflow 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?重点是什么?如果您有错误,您应该发布整个内容。

标签: jquery python json ajax django


【解决方案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 获取一些数据并将其显示在我的页面上
猜你喜欢
  • 2017-04-05
  • 2017-11-16
  • 1970-01-01
  • 2020-08-05
  • 2019-09-16
  • 1970-01-01
  • 2020-01-18
  • 2019-02-05
  • 2014-07-14
相关资源
最近更新 更多