Ajax触发的请求不';t更新Django视图

Ajax触发的请求不';t更新Django视图,django,ajax,Django,Ajax,我试图把这个问题分解成最简单的例子。当请求是ajax时,使用更新的上下文呈现页面不会产生预期的结果 index.html: {%if templateVariable%} {{templateVariable}} {%endif%} 试验 $(文档).ready(函数(){ $(函数(){ $('#testBtn')。单击(函数(事件){ $.ajax({ 类型:“POST”, 网址:“./”, 数据:{ “x”:“x”, “csrfmiddlewaretoken”:“{csrf_令牌}” }

我试图把这个问题分解成最简单的例子。当请求是ajax时,使用更新的上下文呈现页面不会产生预期的结果

index.html:

{%if templateVariable%}
{{templateVariable}}
{%endif%}
试验
$(文档).ready(函数(){
$(函数(){
$('#testBtn')。单击(函数(事件){
$.ajax({
类型:“POST”,
网址:“./”,
数据:{
“x”:“x”,
“csrfmiddlewaretoken”:“{csrf_令牌}”
}
});
});
});
});
视图.py
def索引(请求):
上下文={}
如果request.POST中的“x”:
context['templateVariable']=“我是通过ajax更新的”
打印('ajax-ran')
返回呈现(请求'index.html',上下文)
context['templateVariable']=“我没有通过ajax更新”
打印('未运行ajax')
返回呈现(请求'index.html',上下文)
  • 当我第一次加载页面时,会打印“ajax未运行”,templateVariable为“我未通过ajax更新”,页面会按照预期的方式在h1标记中呈现

  • 当我单击testBtn时,我希望ajax请求触发if语句,更新上下文,并在h1标记中用“我被ajax更新”呈现页面

  • 相反,“ajax-ran”被打印出来,但templateVariable在呈现页面时仍然保持“我没有被ajax更新”“ajax未运行”仅在最初加载页面时打印一次

为什么我得不到预期的结果

编辑:似乎每个人都同意,您不能使用ajax请求返回渲染和更新上下文变量,但我仍然对此有困难,因为我相信这是可能的。下面是一些备用代码:

index2.html:

{%if templateVariable%}
{{templateVariable}}
{%endif%}
试验
$(文档).ready(函数(){
$(函数(){
$('#testBtn')。单击(函数(事件){
$.ajax({
类型:“POST”,
网址:“./”,
数据:{
“x”:“x”,
“csrfmiddlewaretoken”:“{csrf_令牌}”
},
成功:功能(数据){
$('#占位符').html(数据);
},
数据类型:“html”
});
});
});
});
views2.py
def index2(请求):
上下文={}
如果request.POST中的“x”:
context['templateVariable']=“我是通过ajax更新的”
打印('ajax-ran')
返回render\u to\u响应('notIndex.html',上下文)
context['templateVariable']=“我没有通过ajax更新”
打印('未运行ajax')
返回呈现(请求'index.html',上下文)
notIndex.html:
{%if templateVariable%}
{{templateVariable}}
{%endif%}
  • 在本例中,页面最初在上下文中加载templateVariable,因为“我没有通过ajax更新”
  • 单击testBtn时,ajax请求会触发视图中的if块。这将使用更新的上下文呈现notIndex.html
  • ajax调用的success函数将从notIndex.html生成的html设置为h1标记

那么,为什么只有在页面不是来自ajax调用的页面时才可能使用ajax触发页面渲染呢?

您不能从ajax返回渲染或重定向,这就是它的工作方式

如果你想根据服务器上发生的事情更新你的UI,比如说你有一个购物车,并且你想在不刷新页面的情况下实现“添加到购物车”,那么“添加到购物车”按钮必须请求你在
url.py
中提供的端点&如果添加了对象,该url必须返回true,如果没有,则返回false,但它不会在UI上更新它,您需要使用Javascript手动更改购物车项目数

如果您尝试重定向或将渲染返回到ajax,它将获得HTML或重定向/渲染,而不是其他内容

如果您想重定向,您将希望使用JS进行重定向,但不使用来自django的上下文变量


请参见此

,因为使用ajax意味着您不会在浏览器中刷新整个页面,这意味着该页面不会由Django(重新)呈现,因此不会被更新。要使用ajax请求中的数据更新页面,您必须使用javascript自己更新html。index.html中的
if
将在页面首次加载时进行计算。如果您想在加载页面后更改某些内容。使用django模板无法做到这一点。您必须使用JavaScript实现这一点。似乎传统的方法是使用更新的上下文呈现另一个页面,并在success/complete函数中将index.html上某个占位符对象的innerHTML设置为在该另一个页面上生成的html。在这种情况下,每次调用render时都会更新另一个页面的上下文。那么,为什么在呈现同一页面时上下文不会更新呢?因为您已经明确告诉浏览器不要选择使用Ajax。这就是重点。如果ajax请求触发一个视图函数,该函数使用一些上下文变量呈现另一个html页面,那么情况又如何呢。在阿贾克斯的成功中