2016-06-14 43 views
0

这让我疯狂。我正在建立一个电子商务应用,购物车在Django-carton。当我将商品添加到购物车时,我可以将商品的ID从上下文中获取到商店中,并在客户通过点击按钮添加商品时将其传递到我的Ajax调用和视图中。用Ajax从django-carton中删除项目

我希望客户能够使用按钮删除和编辑购物车中的数量,并且现在正在尝试创建我的删除和编辑数量功能。我卡住了,因为我不明白如何在Ajax中传递视图的id。该id不在项目上下文对象中。我可以通过打印ids = request.session['CART']获得视图中的ID,但它没有当前的ID。在上下文中的项目仅限于以下情况:

self.product = product 
self.quantity = int(quantity) 
self.price = Decimal(str(price)) 

Django的纸箱的文档中的例子有这个例子,它不使用JavaScript:

观点:

def remove(request): 
    cart = Cart(request.session) 
    product = Product.objects.get(id=request.GET.get('id')) 
    cart.remove(product) 
    return HttpResponse("Removed") 

网址:

u`rl(r'^remove/$', 'remove', name='shopping-cart-remove'),` 

在我看来,我可以得到购物车中所有物品的ID与

cart = Cart(request.session) 
ids = request.session['CART'] 

这给了我下面的对象:

{u'meal_pk': 15, u'price': u'5', u'quantity': 39} 

但这实际上并没有显得有帮助。这是我第一次见面。我一直在阅读代码https://github.com/lazybird/django-carton/blob/master/carton/cart.py如何编辑或删除购物车中的物品?

回答

1

您仍然可以通过AJAX轻松地通过AJAX调用remove视图;除非另有规定,否则该视图不关心该请求是否通过AJAX提交。所以,我们可以很容易地设置它w/JQuery

所以,在显示购物车,例如模板:

{% load carton_tags %} 
{% get_cart as cart %} 

<script type="text/javascript" src="path/to/jquery.js">/script> 

{% for item in cart.items %} 
    <a onclick='AjaxRemove("{% url 'shopping-cart-remove' %}?id={{ item.product.id }}")'>Remove this item</a> 
{% endfor %} 

<script type="text/javascript"> 
    function AjaxRemove(remove_url) { 
     $.ajax({ 
      url: remove_url, 
      success: function(response) {alert(response);}, 
      error: function() {alert("Couldn't remove item");} 
     }) 
</script> 

将删除该项目,如果AJAX请求成功响应给出一个警告。

您可以进一步自定义视图响应使用request.is_ajax()不同响应AJAX请求:

def remove(request): 
    cart = Cart(request.session) 
    product = Product.objects.get(id=request.GET.get('id')) 
    cart.remove(product) 
    if request.is_ajax(): 
     # do something, respond differently 
     return HttpResponse("Removed (via AJAX)") 
    return HttpResponseRedirect(reverse('shopping-cart-show')) 
+0

原谅可能是愚蠢的问题 - 与会话我可以在JS编辑,并在所有不使用我的意见?我很困惑这是如何工作的。 – fstopzero

+0

只能通过后端访问会话,因此您必须创建视图/端点来更新或检索会话变量。以上情况发生了什么:单击项目的删除按钮时,使用JQuery对Django视图'remove'进行Ajax调用。 Django反过来执行视图,从会话中删除项目。从那里,你可以包含代码来删除客户端通过JS查看的页面上的项目。如果您从购物车中移除某件商品,然后再次调用购物车视图,则该商品不会显示。 –