使用Ajax

时间:2016-06-14 18:24:06

标签: ajax django django-sessions

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

我希望客户能够使用按钮删除和编辑购物车中的数量,现在我正在尝试创建删除和编辑数量功能。我被卡住了,因为我不明白如何在Ajax中传递id的视图。 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如何编辑或删除购物车中的商品?

1 个答案:

答案 0 :(得分:1)

您仍然可以使用Javascript轻松通过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'))