python3 之 天天生鲜 加入购物车及动态效果
加入购物车获取id 和 数量
sku是通过传参来的 获取id
html
<a href="javascript:;" class="add_cart" id="add_cart" sku_id="{{ sku.id }}">加入购物车</a> <script type="text/javascript" src="{% static 'js/jquery-1.12.4.min.js' %}"></script> <script type="text/javascript"> var $add_x = $('#add_cart').offset().top; var $add_y = $('#add_cart').offset().left; var $to_x = $('#show_count').offset().top; var $to_y = $('#show_count').offset().left; $(".add_jump").css({'left':$add_y+80,'top':$add_x+10,'display':'block'}); // 点击加入购物车 $('#add_cart').click(function(){ // 将商品的id 和 数量发送给后端视图,保存到购物车数据中 var req_data = { sku_id: $('#add_cart').attr("sku_id"), count: $("#num_show").val(), csrfmiddlewaretoken: "{{ csrf_token }}" }; // 使用ajax向后端发送数据 $.post('/cart/add/', req_data, function (response_data) { if (0 == response_data.code) { // 添加购物车成功的 $(".add_jump").stop().animate({ 'left': $to_y+7, 'top': $to_x+7}, "fast", function() { $(".add_jump").fadeOut('fast',function(){ $('#show_count').html(response_data.cart_num); }); }); } else { // 添加购物车失败 alert(response_data.message) } }); });
def post(self, request): # 获得商品 id和count sku_id = request.POST.get('sku_id') count = request.POST.get('count') # 判断参数完整性 if not all([sku_id, count]): return JsonResponse({'code': 2, 'message': '参数不完整'}) # 判断商品是否存在 try: sku = GoodsSKU.objects.get(id=sku_id) except GoodsSKU.DoesNotExist: return JsonResponse({'code': 3, 'message': '商品不存在'}) # 判断 count数量 是否可用 转换为整形 try: count = int(count) except Exception as e: print(e.with_traceback,'错误类型-----------------------') return JsonResponse({'code': 4, 'message': '数量错误'}) #判断库存 if count > sku.stock: return JsonResponse({'code': 5, 'message': '库存不足'}) #判断用户已登陆 购物车存入数据库 if request.user.is_authenticated(): #创建django-redis客户端 redis_conn = get_redis_connection('default') #获取用户 id user_id = request.user.id #从数据库获取cart_%s value值 user_id:{sku_id(key),count(value)} origin_count = redis_conn.hget('cart_%s'%user_id,sku_id) # 如果商品在购物车中存在,就直接累加商品数量 if origin_count != None: count += int(origin_count) # 写入数据库 redis_conn.hset('cart_%s'%user_id,sku_id,count) #获取购物车 商品数量 cart_num = 0 #获取全部购物车数据 cart_dict = redis_conn.hgetall('cart_%s'%user_id) # 遍历得到value 全部数量相加总和 for num in cart_dict.values(): #从数据库得到的是字节 需要转换为整数 cart_num += int(num) # json方式响应添加购物车结果 code:代码;编码 return JsonResponse({'code': 0, 'message': '添加购物车成功', 'cart_num': cart_num}) else: #购物车存入 cookie # 判断cookie 中是否有 cart信息 if request.COOKIES.get('cart'): #如果 cookie中存在 cart 就加载出来 cart_dict = json.loads(request.COOKIES['cart']) else: cart_dict = {} # 查看该商品是否存在cookie if sku_id in cart_dict.items(): #存在 该商品相加 count += cart_dict[sku_id] #更新该商品数量 cart_dict[sku_id] = count # 把新数据转换为json 进行序列化转储 dump:有 转储 的意思 new_cart = json.dumps(cart_dict) #定义购物车显示数量 cart_num = 0 for num in cart_dict.values(): cart_num += num # json方式响应添加购物车结果 response = JsonResponse({'code': 0, 'message': '添加购物车成功', 'cart_num': cart_num}) # 存入 cookie response.set_cookie("cart", new_cart) return response