2017-01-28 7 views
2

このコンテキストプロセッサページ(AJAX)をリロードせずにdjangoテンプレート変数を更新するには?

def cart_proc(request): 
    return (dict(cart=Cart(request))) 

は、私は、変数{{カートは}}私のテンプレートでは、私は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; 
}); 
} 

そして、私のビュー(私は私のカートのためのジャンゴ - カートを使用)

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'}) 

私は、カートに製品を追加するとき、私は{{cart.countを}}更新したいですAJAXで、ページを再読み込みすることなく。これで、リロード後にのみ更新されます。

答えて

2

私はあなたのdjangoアプリケーションがあなたのクライアントとどのように通信しているのかについて誤解を感じていると思います。要求応答のライフサイクルを理解する必要があります。

テンプレートコンテキストは、リクエストレスポンスライフサイクル内にのみ存在します。クライアントからのすべての要求は、新しいテンプレートコンテキストを持つ新しいワーカーを開始して応答を生成します。 クライアントアプリケーションとdjangoとの間に持続的ステートフル接続がありません。

つまり、クライアントサイドページを再ロードせずに更新したい場合(再リクエストする場合)は、JsonResponseで新しいカードカウントをクライアントに渡し、応答を処理するjavascriptコードを表示させる必要があります。値。

+0

私はそれをしました。ご説明ありがとうございます。 –

2

できません。ページがレンダリングされると、すべてのテンプレート変数が消えます。 input hiddenを使用してcart.countの値を格納し、その値を更新できます。

関連する問題