后端更改后如何更新Django的模板

时间:2018-08-27 17:14:26

标签: python django templates render

每个人。我从Python和Django开始,我想在代码中添加一些Ajax。

我正在通过在模板上显示产品以及更改其价格的输入来进行练习。 我已经能够更改他在数据库上的值,但是在那之后,我想更新模板的上下文以查看新值。我要更新的字段是表的最后一行。

{% 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>

JS:

$("#send").click(function(){
  $.post("/inicio/acciones/update/", {search: 1, price : $("#price").val()} ).done(function(res){
})

});

后端

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”变量具有正确的值,但我的模板未更新。

如何更新上下文?

1 个答案:

答案 0 :(得分:0)

由于您正在使用AJAX,因此我假设您要执行的任何操作都希望在不重新加载整个页面的情况下进行。

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