Python 如何更新Django';后端更改后的模板

Python 如何更新Django';后端更改后的模板,python,django,templates,render,Python,Django,Templates,Render,各位。我从Python和Django开始,我想在代码中添加一些Ajax 我通过在模板上显示一个产品以及一个输入来改变它的价格。 我已经能够在DB上更改他的值,但之后我想更新模板的上下文以查看新值。我要更新的字段是表的最后一行 {% csrf_token %} <table> <tr> <th>Product</th> <td>{{product.name}}</td> </tr> <tr>

各位。我从Python和Django开始,我想在代码中添加一些Ajax

我通过在模板上显示一个产品以及一个输入来改变它的价格。 我已经能够在DB上更改他的值,但之后我想更新模板的上下文以查看新值。我要更新的字段是表的最后一行

{% csrf_token %}
<table>
<tr>
  <th>Product</th>
  <td>{{product.name}}</td>
</tr>
<tr>
  <th>Price</th>
  <td><input id="price" type="text" value="{{product.price}}" placeholder="Price" autocomplete="off"/></td>
</tr>
<tr>
  <td colspan="2" style='background:none'><input id="send" type="button" value="Update"/></td>
</tr>
<tr>
  <th>Current values:</th>
  <td>{{product.name}} : ${{product.price}}</td>
</tr>
</table>
}))

后端

def update(request):
  """backend changes
  ...
  """

  t = loader.get_template('inicio/index.html')
  product= Product.objects.get(pk=search)
  context = {
    'product' : product,
  }
  t.render(context)
  return HttpResponse(product.price)
“product”变量具有正确的值,但我的模板未更新


如何更新上下文?

因为您使用的是AJAX,所以我假设您尝试执行的任何操作都不需要重新加载整个页面

  • 如果是这样的话。。。
    • Django模板帮不了你。至少,不是你想的那样。 Django模板根据提供给它们的信息生成HTML。看起来 就像在AJAX响应中将所需的查询集返回给客户机一样。 如果我错了,有人会纠正我,但是,Django在这里很聪明,而且它确实回来了 您的查询设置为一个格式良好的JSON响应。一旦你的客户拥有 响应时,由客户端上运行的javascript显示信息 以你想要的方式。您必须解析JSON响应并显示 通过操纵页面元素来获取信息(可能使用JQUERY,因为您似乎已经在使用它)。选项#2不是将过滤后的查询集直接传递回客户机,而是将其传递给模板,让它生成更多的HTML和更小的信息子集。然后你可以把它传给客户。不过,您仍然需要删除现有的页面元素,并使用javascript将它们替换为新的HTML。正如您所看到的,AJAX的内容非常复杂,只有当重新加载页面没有意义时,您才会这样做
  • 如果你想重新加载整个页面,但是。。。
    • 这将是一个开始学习Django表单的好机会。您不仅能够以自己想要的方式使用模板,表单提交也是Django的一个非常重要的部分。您可以将其设置为表单(获取请求表单)的提交按钮,而不是运行AJAX请求的
      #send
      按钮。提交此表单并将其指向同一URL将加载一个新页面。这里需要注意的是,表单还将发送一些额外的数据以及GET请求,我们可以在视图中读取这些数据。然后,在收到GET请求时,视图可以尝试读取该请求的内容。如果没有任何内容,您可以默认显示所有内容(我假设您现在正在这样做),但是如果请求中有内容,您可以阅读它,并使用该信息过滤发送到模板的查询集。您最终将使用相同的模板,但它会根据视图提供给它的查询集显示更多或更少的信息

  • 欢迎来到堆栈溢出。你能澄清你的问题吗?如果
    product
    具有您想要的属性,是什么阻止您在模板中使用它们?Ajax
    done
    函数的其余部分在哪里?Daniel,done函数什么都不做。我希望只使用更新功能就可以更新模板。谢谢,@Chris。嗯,模板已经加载,我要找的是在整个上下文中发送产品。模板首先加载产品变量。这可能吗?如果不使用Ajax,页面将自动更新。使用Ajax的全部目的就是防止这种情况的发生,这样您就可以在JS中以编程方式进行更新。既然你不想这么做,你为什么要使用Ajax呢?别这样。这很好地解释了我的选择。非常感谢你。我现在将研究Django表单。
    def update(request):
      """backend changes
      ...
      """
    
      t = loader.get_template('inicio/index.html')
      product= Product.objects.get(pk=search)
      context = {
        'product' : product,
      }
      t.render(context)
      return HttpResponse(product.price)