【发布时间】:2018-03-21 23:26:09
【问题描述】:
我正在尝试创建一个函数以在会话中清空我的购物车中的所有商品。我有一个非常好的功能,可以删除单个项目,但不能让它对所有人都有效。你能告诉我我做错了什么吗?谢谢!我尝试创建以下函数:
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')
模板
...
<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
【问题讨论】:
-
你能放置完整的购物车对象吗?
-
@Walucas 更新代码以显示购物车对象
-
好的,我有几个 cmets,但是之前,你能告诉你如何知道在 clear 方法后购物车不是空的吗?
-
我刚刚刷新了本地服务器上的页面,只是为了查看商品是否仍在购物车中。当我使用 remove 方法时,它会自动执行。我正在寻找相同的结果
标签: django python-3.x session django-templates cart