【问题标题】:Django template not re-rendering on successful AJAX get requestDjango 模板未在成功的 AJAX 获取请求时重新呈现
【发布时间】:2017-09-14 09:22:46
【问题描述】:

我编写了一个非常简单的 ajax 代码,它发出一个 get 请求,它期望 django 模板值作为响应。因此,当我尝试在网络下的 chrome 中执行此 ajax 代码时,我可以看到 get 请求成功,并且在网络下的预览部分中,我可以看到我预期的模板值,但网页保持不变,不不会再次渲染。

我的看法:

def test(request,id=1):
    return render(request,'test.html',{'num':id,'next':9})

我的模板和 ajax 代码:

<script src='https://code.jquery.com/jquery-3.2.1.min.js'></script>
<p>{{num}}</p>
<button onclick='test({{next}})'>Test</button>

<script>
function test(next){
    $.ajax({
        url:'/test/'+next,
        type: 'GET',
        success: function(){
            console.log('done');
        }
    });
}
</script>

当我开始 '/test/66' 时,请检查我的问题的示例图像,单击按钮,得到所需的响应,仍然没有变化。

【问题讨论】:

  • 您正在混合服务器端渲染 (DTL) 和客户端 (javascript)
  • 既然我有了需要呈现的响应,我下一步应该如何更新页面??

标签: ajax django


【解决方案1】:

您正在混合使用服务器端渲染 (DTL) 和客户端 (javascript)。一旦 django 呈现模板,您的 javascript 就无法访问服务器端变量为 {{ text }}。

你必须这样做:

SSR 之前的模板

<div id="content">
  <p>{{num}}</p>
  <button onclick='test({{next}})'>Test</button>
</div>

<script>
    function test(next){
        $.ajax({
            url:'/test/'+next,
            type: 'GET',
            success: function(data){
                document.querySelector('#content p').innerHTML(data);
            }
        });
    }
    </script>

SSR 之后的模板(类似这样,你明白了)

<div id="content">
  <p>66</p>
  <button onclick='test(66)'>Test</button>
</div>

<script>
function test(next){
    $.ajax({
        url:'/test/'+next,
        type: 'GET',
        success: function(data){
            document.querySelector('#content p').innerHTML(data)
        }
    });
}
</script>

【讨论】:

  • 谢谢,我以为 ajax 调用会处理所有事情,这显然是错误的。这是有道理的。
  • 没问题!我的荣幸。使用客户端框架(如使用 {{ }} 语法来输出变量的 angular 和 vuejs 等客户端框架时也可能会造成混淆;)!
猜你喜欢
  • 2020-08-31
  • 2012-04-03
  • 2022-01-26
  • 2014-10-20
  • 2019-04-22
  • 2018-09-09
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多