17.3 全选购物车
分析与设计
登录状态下,用户勾选购物车页面的“全选”时,将购物车中所有商品的sku_id放在set集合, 再发送到前端;反选时,移除集合中的所有商品。
未登录状态下,逻辑一致。
实现
在carts应用views.py中新增如下视图类
class CartsSelectAllView(View):"""全选购物车"""def put(self, request):# 检验参数json_dict = json.loads(request.body.decode())selected = json_dict.get('selected')if selected:if not isinstance(selected, bool):return HttpResponseForbidden('参数selected有误')# 获取登录对象user = request.userif user.is_authenticated:# 登录状态下redis_conn = get_redis_connection('carts')redis_cart = redis_conn.hgetall('carts_%s' % user.id)cart_sku_ids = redis_cart.keys()print(cart_sku_ids)if selected:# 全选redis_conn.sadd('selected_%s' % user.id, *cart_sku_ids)else:redis_conn.srem('selected_%s' % user.id, *cart_sku_ids)return JsonResponse({'code': RETCODE.OK, 'errmsg': '全选购物车成功'})else:cart_str = request.COOKIES.get('carts')response = JsonResponse({'code': RETCODE.OK, 'errmsg': '全选购物车成功'})if cart_str:cart_dict = pickle.loads(base64.b64decode(cart_str.encode()))for sku_id in cart_dict:cart_dict[sku_id] = selectedcookie_cart_str = base64.b64encode(pickle.dumps(cart_dict)).decode()response.set_cookie('carts', cookie_cart_str, max_age=constants.CARTS_COOKIE_EXPIRES)return response
在carts应用下urls.py本新增路由
path('carts/selection/', views.CartsSelectAllView.as_view()),