此上下文处理器
def cart_proc(request):
return (dict(cart=Cart(request)))
在我的模板中给了我变量 {{cart}},所以我可以在 base.html 中使用 {{ cart.count }}。计数是计算购物车中产品数量的方法。
这是我的 js
function addProduct(){
$('form.add-product').on('submit', function(){
var link = $(this)
var quantity = $(this).find('#id_quantity').val()
$.ajax({
'url': link.attr('action'),
'type': 'POST',
'dataType': 'json',
'data': {
'quantity': quantity,
'csrfmiddlewaretoken': $('input[name="csrfmiddlewaretoken"]').val()
},
'success': function(data, status, xhr){
alert('Success');
return false;
},
'error': function(xhr, status, error){
alert('Error on server. Please try again later.');
return false;
}
});
return false;
});
}
和我的观点(我使用django-cart作为我的购物车)
def add_to_cart(request, id):
form = QuantityForm(request.POST)
if form.is_valid():
product = Product.objects.get(id=id)
quantity = request.POST['quantity']
cart = Cart(request)
cart.add(product, product.price, quantity)
return JsonResponse({'status': 'success'})
我想在使用 AJAX 在购物车中添加产品时更新 {{cart.count}},而无需重新加载页面。现在它仅在重新加载后更新。
我认为你对你的django应用程序如何与你的客户端通信有点误解。您必须了解请求响应生命周期。
模板上下文仅存在于请求响应生命周期中。来自客户端的每个请求都将使用新的模板上下文启动一个新的工作线程以生成响应。客户端应用程序和 django 之间没有持久的有状态连接。
这意味着,如果要更新客户端页面而不重新加载(再次请求),则必须将新卡计数与JsonResponse
一起传递给客户端,并让处理响应的 javascript 代码更新显示的值。
你不能。呈现页面后,所有模板变量都将消失。可以使用input hidden
来存储cart.count
值,然后更新该值。