【问题标题】:remove item from django-carton with Ajax使用 Ajax 从 django-carton 中删除项目
【发布时间】:2016-10-15 15:02:00
【问题描述】:

这快把我逼疯了。我正在构建一个电子商务应用程序,购物车位于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 如何编辑或删除购物车中的商品?

【问题讨论】:

    标签: ajax django django-sessions


    【解决方案1】:

    您仍然可以使用 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'))
    

    【讨论】:

    • 请原谅这个可能很愚蠢的问题——我可以在 JS 中编辑会话,而根本不使用我的视图?我很困惑这是如何工作的。
    • 会话只能通过后端访问,因此您必须创建一个视图/端点来更新或检索会话变量。上面发生了什么:当单击一个项目的删除按钮时,使用 JQuery 对 Django 视图 remove 进行 Ajax 调用。 Django 依次响应执行视图,从会话中删除项目。从那里,您可以包含代码以从客户端通过 JS 查看的页面中删除该项目。如果您从购物车中删除了一个项目,然后再次调用购物车视图,则该项目不会出现。
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2020-08-31
    • 2021-10-15
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多