python3 之 天天生鮮 加入購物車及動態效果
阿新 • • 發佈:2020-10-29
加入購物車獲取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