后端更改后如何更新 Django 的模板
How to update Django's template after backend change
各位。我从 Python 和 Django 开始,我想在我的代码中添加一些 Ajax。
我正在通过在模板上展示产品以及更改产品价格的输入来练习。
我已经能够更改他在数据库上的值,但之后我想更新模板的上下文以查看新值。我要更新的字段是 table.
的最后一行
{% 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' var 具有正确的值,但我的模板未更新。
如何更新上下文?
由于您使用的是 AJAX,我将假设您尝试执行的任何操作都希望在不重新加载整个页面的情况下执行。
- 如果是这样...
- Django 模板不会帮助您。至少,不是你想的那样。
Django 模板根据提供给它们的信息生成 HTML。它看起来
就像您在 AJAX 响应中将所需的查询集返回给客户端一样。
如果我错了,请有人纠正我,但是 Django 在这里很聪明,它实际上正在返回
您的查询集作为已经很好地格式化的 JSON 响应。一旦您的客户拥有
response,由客户端的javascript运行来显示信息
以你想要的方式。您必须解析 JSON 响应并显示
通过操作页面元素来获取信息(可能使用 JQUERY 因为你似乎已经在使用它了)。选项 #2 不是将过滤后的查询集直接传递回客户端,而是可以将其传递给模板并让它生成更多 HTML 和更小的信息子集。然后也许你把它传回给客户。不过,您仍然需要擦除现有页面元素并使用 javascript 将它们替换为这个新的 HTML。如您所见,AJAX 内容非常复杂,您实际上只在重新加载页面没有意义时才这样做。
- 如果您打算重新加载整个页面...
- 这将是开始学习 Django 表单的好机会。您不仅可以按照自己的方式使用模板,而且表单提交是 Django 的一个非常重要的部分。代替您的
#send
按钮 运行 一些 AJAX 请求,您可以使它成为表单的提交按钮(GET 请求表单)。提交此表单并将其指向相同的 URL 将加载一个新页面。这里要注意的是,您的表单还将发送一些额外的数据以及我们可以在视图中读取的 GET 请求。然后,您的视图可以在收到 GET 请求后尝试读取该请求的内容。如果什么都没有,您可以默认显示所有内容(我假设这就是您现在正在做的)但是如果请求中有内容,您可以阅读它,并使用该信息过滤您发送到模板的查询集.您最终会使用相同的模板,但它会根据视图提供给它的查询集显示或多或少的信息。
各位。我从 Python 和 Django 开始,我想在我的代码中添加一些 Ajax。
我正在通过在模板上展示产品以及更改产品价格的输入来练习。 我已经能够更改他在数据库上的值,但之后我想更新模板的上下文以查看新值。我要更新的字段是 table.
的最后一行{% 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' var 具有正确的值,但我的模板未更新。
如何更新上下文?
由于您使用的是 AJAX,我将假设您尝试执行的任何操作都希望在不重新加载整个页面的情况下执行。
- 如果是这样...
- Django 模板不会帮助您。至少,不是你想的那样。 Django 模板根据提供给它们的信息生成 HTML。它看起来 就像您在 AJAX 响应中将所需的查询集返回给客户端一样。 如果我错了,请有人纠正我,但是 Django 在这里很聪明,它实际上正在返回 您的查询集作为已经很好地格式化的 JSON 响应。一旦您的客户拥有 response,由客户端的javascript运行来显示信息 以你想要的方式。您必须解析 JSON 响应并显示 通过操作页面元素来获取信息(可能使用 JQUERY 因为你似乎已经在使用它了)。选项 #2 不是将过滤后的查询集直接传递回客户端,而是可以将其传递给模板并让它生成更多 HTML 和更小的信息子集。然后也许你把它传回给客户。不过,您仍然需要擦除现有页面元素并使用 javascript 将它们替换为这个新的 HTML。如您所见,AJAX 内容非常复杂,您实际上只在重新加载页面没有意义时才这样做。
- 如果您打算重新加载整个页面...
- 这将是开始学习 Django 表单的好机会。您不仅可以按照自己的方式使用模板,而且表单提交是 Django 的一个非常重要的部分。代替您的
#send
按钮 运行 一些 AJAX 请求,您可以使它成为表单的提交按钮(GET 请求表单)。提交此表单并将其指向相同的 URL 将加载一个新页面。这里要注意的是,您的表单还将发送一些额外的数据以及我们可以在视图中读取的 GET 请求。然后,您的视图可以在收到 GET 请求后尝试读取该请求的内容。如果什么都没有,您可以默认显示所有内容(我假设这就是您现在正在做的)但是如果请求中有内容,您可以阅读它,并使用该信息过滤您发送到模板的查询集.您最终会使用相同的模板,但它会根据视图提供给它的查询集显示或多或少的信息。
- 这将是开始学习 Django 表单的好机会。您不仅可以按照自己的方式使用模板,而且表单提交是 Django 的一个非常重要的部分。代替您的