django从购物车中删除项目

时间:2013-09-18 16:13:05

标签: django

我正在关注django电子商务书中的购物车示例,当涉及从购物车中删除商品时,我遇到了一个问题,我无法从会话中删除单个商品。

这是我的cart.py

的一部分
class Cart(object):
    class Item(object):
    def __init__(self, itemid, product, quantity=1, price=0):
    self.itemid = itemid
    self.product = product
    self.quantity = quantity
    self.price = price
    self.totalprice = price * quantity
def remove_item(self, itemid):
    self.items = filter(lambda x: x.itemid != itemid, self.items)

views.py

def remove_from_cart(request, cart_item_id):
     cart = get_shopping_cart(request)
     cart.remove_item(int(cart_item_id))
     update_shopping_cart(request, cart)
     cart = get_shopping_cart(request)
     ctx = {'cart': cart}

我正在使用Python 2.7和Django 1.5。 remove_item方法的定义有什么问题吗?我已经尝试了几种选择,但不能让它发挥作用 任何提示都将不胜感激。

编辑:我的update_shopping_cart方法是:

def update_shopping_cart(request, cart):
    request.session['cart'] = cart

购物车允许删除商品的视图:

def shopping_cart(request): 
    cart = get_shopping_cart(request)
    if request.method == 'POST':
        cart = get_shopping_cart(request)
        cart.remove_item(cart_item_id)
        update_shopping_cart(request, cart)
        cart = get_shopping_cart(request)   
        ctx = {'cart': cart} 
    render_to_response(...)

2 个答案:

答案 0 :(得分:0)

添加此行有帮助吗?

def update_shopping_cart(request, cart):
    request.session['cart'] = cart
    request.session.modified = True

答案 1 :(得分:0)

我认为有两个问题:

  1. 您是否设置了SESSION_SAVE_EVERY_REQUEST=True

  2. 方法

    def remove_from_cart(request, cart_item_id):
    
        cart = get_shopping_cart(request)
        cart.remove_item(int(cart_item_id))
        update_shopping_cart(request, cart)
        cart = get_shopping_cart(request)
        ctx = {'cart': cart}
    
  3. 您实际上是在提取数据,然后将其更改为再次获取旧数据。为什么要做第二个cart = get_shopping_cart(request)?这可能会覆盖你刚刚做出的改变。

    调整代码如下

    def remove_from_cart(request, cart_item_id):
        cart = get_shopping_cart(request)
        cart.remove_item(int(cart_item_id))
        update_shopping_cart(request, cart)
        # cart = get_shopping_cart(request)
        ctx = {'cart': cart}
    

    并根据Greg的建议调整您的update_shopping_cart(request, cart)

    def update_shopping_cart(request, cart):
        request.session['cart'] = cart
        request.session.modified = True