在上一小节中,会发现加入购物车,如果用户未登录,是将添加到购物车的商品存储在浏览器的 cookie 中;如果用户已登录,则保存购物车数据到redis中,然后是返回处理结果。
response.set_cookie("cart", new_cart_json)
同样,用户查看购物车信息,如果用户未登录,从 cookie 中取出商品数据;如果用户已登录,从redis中获取数据。
① 购物车信息
class CartInfoView(View):
"""购物车信息"""
def get(self, request):
"""提供购物车页面"""
# 业务逻辑, 查询购物车数据
if not request.user.is_authenticated():
# 如果用户未登录,从cookie获取数据
cart_json = request.COOKIES.get("cart")
if cart_json is not None:
cart = json.loads(cart_json)
else:
# cookie中不存在购物车数据
cart = {}
else:
# 如果用户已登录,从redis中获取数据
redis_conn = get_redis_connection("default")
user_id = request.user.id
cart = redis_conn.hgetall("cart_%s" % user_id)
# 遍历cart字典,形成模板所需要的数据
skus = []
total_amount = 0 # 总金额
total_count = 0 # 总数量
for sku_id, count in cart.items():
try:
sku = GoodsSKU.objects.get(id=sku_id)
except GoodsSKU.DoesNotExist:
# 商品不存在
continue
count = int(count)
amount = sku.price * count # Decimal
sku.amount = amount # 商品的金额
sku.count = count # 商品的数量
skus.append(sku)
total_amount += amount
total_count += count
# 返回处理结果, 渲染模板
context = {
"skus": skus,
"total_amount": total_amount,
"total_count": total_count
}
return render(request, "cart.html", context)