首页
学习
活动
专区
圈层
工具
发布

Django实战-生鲜电商-购物车信息

在上一小节中,会发现加入购物车,如果用户未登录,是将添加到购物车的商品存储在浏览器的 cookie 中;如果用户已登录,则保存购物车数据到redis中,然后是返回处理结果。

代码语言:javascript
代码运行次数:0
复制
response.set_cookie("cart", new_cart_json)

同样,用户查看购物车信息,如果用户未登录,从 cookie 中取出商品数据;如果用户已登录,从redis中获取数据。

① 购物车信息

代码语言:javascript
代码运行次数:0
复制
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)
下一篇
举报
领券