【问题标题】:How to update Django's template after backend change后端更改后如何更新Django的模板
【发布时间】:2019-02-02 06:32:19
【问题描述】:

每个人。我从 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)

“产品”变量具有正确的值,但我的模板未更新。

如何更新上下文?

【问题讨论】:

  • 欢迎来到 Stack Overflow。你能澄清你的问题吗?如果product 具有您想要的属性,是什么阻止您在模板中使用它们?
  • 你的 Ajax done 函数的其余部分在哪里?
  • Daniel,done 函数什么都不做。我希望可以仅使用更新功能来更新模板。
  • 谢谢,@Chris。好吧,模板已经加载,我正在寻找的是在整个上下文中发送产品。模板首先加载了一个产品变量。这可能吗?
  • 页面会自动更新如果你没有使用Ajax。使用 Ajax 的全部意义在于防止这种情况发生,以便您可以在 JS 本身中以编程方式更新事物。既然您不想那样做,那么您究竟为什么要使用 Ajax?只是不要。

标签: python django templates render


【解决方案1】:

由于您使用的是 AJAX,我将假设您尝试执行的任何操作都不需要重新加载整个页面。

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

【讨论】:

  • 这很好地解释了我的选择。太感谢了。我现在将研究 Django 表单。
猜你喜欢
  • 2015-03-26
  • 2014-11-11
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 2021-04-14
  • 2019-07-20
  • 2019-01-15
相关资源
最近更新 更多