使用 Ajax 从 django-carton 中删除项目

remove item from django-carton with Ajax

这让我发疯。我正在构建一个电子商务应用程序,购物车在 Django-carton 中。当我将商品添加到购物车时,我可以从上下文中获取商品的 ID 并将其传递到我的 Ajax 调用中,并在客户通过单击按钮添加商品时将其传递到视图中。

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

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

Django-carton的文档中的例子有这个例子,没有使用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 如何编辑或删除购物车中的商品?

您仍然可以使用 Javascript 通过 AJAX 轻松调用 remove 视图;除非另有说明,否则视图不关心请求是否通过 AJAX 提交。因此,我们可以使用 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'))