2017-01-28 2 views
2

Dieser Kontext ProzessorWie aktualisiert man die Django-Vorlagenvariable, ohne die Seite neu zu laden (AJAX)?

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

gibt mir Variable {{}} Warenkorb in meiner Vorlage, so kann ich {{cart.count}} in base.html. count ist eine Methode, die die Anzahl der Produkte im Warenkorb zählt.
Das ist mein 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; 
}); 
} 

Und meiner Meinung nach (ich django-Wagen für den Warenkorb verwenden)

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

I {{cart.count}}, wenn ich hinzufügen Produkt im Warenkorb aktualisieren möchten mit AJAX, ohne Seite neu zu laden. Jetzt aktualisiert es nur nach dem Neuladen.

Antwort

2

Ich denke, Sie haben ein bisschen ein Missverständnis darüber, wie Ihre Django-Anwendung mit Ihrem Client kommuniziert. Sie müssen den Lebenszyklus der Anfrageantwort verstehen.

Ihr Vorlagenkontext existiert nur innerhalb des Request-Response-Lebenszyklus. Bei jeder Anforderung von Ihrem Client wird ein neuer Worker mit einem neuen Vorlagenkontext zum Generieren einer Antwort gestartet. Es gibt keine dauerhafte statusreiche Verbindung zwischen Ihrer Client-Anwendung und Django.

Das bedeutet, wenn Sie Ihre Clientseite aktualisieren möchten, ohne sie erneut zu laden (erneut anfordern), müssen Sie die neue Kartenanzahl mit Ihrem JsonResponse an den Client übergeben und den JavaScript-Code, der die Antwort verarbeitet, aktualisieren Wert.

+0

Ich habe es getan. Vielen Dank für die Erklärung. –

2

Sie können nicht. Sobald die Seite gerendert wurde, verschwinden alle Vorlagenvariablen. Sie können input hidden verwenden, um den Wert cart.count zu speichern und diesen Wert dann zu aktualisieren.

Verwandte Themen