Django无法创建删除会话/购物车中所有项目的函数
我正在尝试创建一个函数,在会话中清空购物车中的所有项目。我有一个非常好的函数,可以删除单个项目,但不能让它对所有项目都起作用。你能告诉我我做错了什么吗?谢谢我已尝试创建以下函数:Django无法创建删除会话/购物车中所有项目的函数,django,python-3.x,session,django-templates,cart,Django,Python 3.x,Session,Django Templates,Cart,我正在尝试创建一个函数,在会话中清空购物车中的所有项目。我有一个非常好的函数,可以删除单个项目,但不能让它对所有项目都起作用。你能告诉我我做错了什么吗?谢谢我已尝试创建以下函数: def empty(self): for each in self.cart: del each self.save() 购物车 在我的url/视图/模板中调用它,如: url.py views.py 模板 非常感谢您的洞察力!完整购物车.py如下: class Car
def empty(self):
for each in self.cart:
del each
self.save()
购物车
在我的url/视图/模板中调用它,如:
url.py
views.py
模板
非常感谢您的洞察力!完整购物车.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
def clear(self):
self.cart.clear() # Affects both self.cart and session
self.session.modified = True
您可以只清除原始词典,而不是在clear中指定新词典:
self.session.cart[settings.CART_SESSION_KEY] = {} # self.cart still populated
def clear(self):
self.cart.clear() # Affects both self.cart and session
self.session.modified = True
你能放置完整的购物车对象吗?@Walucas更新了显示购物车对象的代码好的,我有一些评论,但之前,你能告诉我在clear方法后你如何知道购物车不是空的吗?我只是刷新了本地服务器上的页面,只是为了看看购物车中是否还有物品。当我使用remove方法时,它会自动执行。我在寻找同样的结果,这正是问题所在!非常感谢你。
self.session.cart[settings.CART_SESSION_KEY] = {} # self.cart still populated
def clear(self):
self.cart.clear() # Affects both self.cart and session
self.session.modified = True