Django 无法创建函数来删除会话/购物车中的所有项目

Django trouble creating function to delete all items in sessions / cart

我正在尝试创建一个函数来清空会话中购物车中的所有商品。我有一个非常好的功能,可以删除单个项目,但不能让它对所有人都有效。你能让我知道我做错了什么吗?谢谢!我尝试创建以下函数:

cart.py

class Cart(object):
    ...
        def clear(self):
    self.session.cart[settings.CART_SESSION_KEY] = {}
    self.session.modified = True

在我的 url/views/template 中这样调用它:

urls.py

    path('cart/clear/', Buylist_views.clear, name= 'empty_cart'),

views.py

    def clear(request):
    cart = Cart(request)
    cart.clear()
    return redirect('cart')

template

...
<button type="submit" formaction="{% url 'empty_cart' %}">
Empty Cart </button>
      </form>

我也试过以下功能:

    def empty(self):
    for each in self.cart:
        del each
    self.save()

非常感谢您的见解!以下完整 Cart.py:

    class Cart(object):


    def __init__(self, request):
        self.session = request.session


        if not hasattr(settings, 'CART_SESSION_KEY'):
            raise KeyNotSet('Session key identifier is missing in settings')

        if not hasattr(settings, 'PRODUCT_MODEL'):
            raise KeyNotSet('Product model is missing in settings')

        cart = self.session.get(settings.CART_SESSION_KEY)

        if not cart:
            is_model_set = hasattr(settings, 'USE_CART_MODELS')
            if is_model_set and settings.USE_CART_MODELS:
                # cart =
                pass
            else:
                cart = self.session[settings.CART_SESSION_KEY] = {}

        self.cart = cart

    def add(self, product, price, quantity=1,):
        product_id = str(product.id)
        if product_id not in self.cart:
            self.cart[product_id] = {'price': str(price), 'quantity': 0}

        self.cart[product_id]['quantity'] = int(quantity)
        self.save()



        self.cart[product_id]['quantity'] = int(quantity)
        self.save()


    def save(self):
        self.session[settings.CART_SESSION_KEY] = self.cart
        self.session.modified = True

    def remove(self, product):
        product_id = str(product.id)
        if product_id in self.cart:
            del self.cart[product_id]
            self.save()

    def empty(self):
        for each in self.cart:
            del each
        self.save()



    def __iter__(self):
        product_ids = self.cart.keys()

        splitted = settings.PRODUCT_MODEL.split('.')
        app_label = splitted[0]
        model_name = splitted[1]

        try:
            model = apps.get_model(app_label, model_name)
        except LookupError:
            message = 'Model {} not found in app  {}'
            raise ModelDoesNotExist(message.format(model_name, app_label))

        products = model.objects.filter(id__in=product_ids)
        for product in products:
            self.cart[str(product.id)]['product'] = product

        for item in self.cart.values():
            item['price'] = Decimal(item['price'])
            item['total_price'] = item['price'] * item['quantity']
            yield item

    def __len__(self):
        return sum(item['quantity'] for item in self.cart.values())


    @property
    def total_price(self):
        return sum(Decimal(item['price']) * item['quantity'] for item in self.cart.values())

    @property
    def cart_length(self):
        return sum(item['quantity'] for item in self.cart.values())


    def clear(self):
        self.session.cart[settings.CART_SESSION_KEY] = {}
        self.session.modified = True

问题是,当您创建购物车时,您会创建一个空字典并将其分配给 self.cart 和会话:

cart = self.session[settings.CART_SESSION_KEY] = {}
self.cart = cart

但是当您清除购物车时,您创建了一个空字典并将其仅分配给会话,留下 self.cart 指向原始 - 仍然填充 - 字典:

self.session.cart[settings.CART_SESSION_KEY] = {}  # self.cart still populated

与其在 clear() 中分配新词典,不如清除原始词典:

def clear(self):
    self.cart.clear()  # Affects both self.cart and session
    self.session.modified = True