1購物車中商品刪除功能
頁面重新刷新
location.href = '/cart/cart/'
頁面重新加載
location.reload()
<a onclick="del_cart({{ goods.0.id }})">刪除</a>
function del_cart(id) {
var csrf = $('input[name="csrfmiddlewaretoken"]').val()
$.ajax({
url:'/cart/del_cart/' + id + '/',
type:'POST',
headers:{'X-CSRFToken':csrf},
dataType:'json',
success:function (data) {
刪除標簽
var nodeGoods = $('#goods_'+ id)
nodeGoods.remove()
cart_price()
},
error:function (data) {
alert('刪除失敗')
}
})
}
視圖層刪除函數(shù)
def del_cart(request, id):
if request.method == 'POST':
在session中刪除購物車中刪除的某個商品
session_goods = request.session.get('goods')
for re_goods in session_goods:
if re_goods[0] == id:
session_goods.remove(re_goods)
break
request.session['goods'] = session_goods
刪除數(shù)據(jù)庫中對應的session中被刪除的數(shù)據(jù)
user_id = request.session.get('user_id')
if user_id:
ShoppingCart.objects.filter(goods_id=id, user_id=user_id).delete()
return JsonResponse({'code': 200, 'msg': '請求成功'})
2中間件登陸校驗
主要區(qū)分哪些網址需要校驗宪潮,哪些不需要校驗,在需要校驗的強制其跳轉到登陸界面進行登陸
class LoggingMiddleware(MiddlewareMixin):
def process_request(self, request):
user_id = request.session.get('user_id')
path = request.path
不需要做登陸校驗的地址
not_need_check = ['/user/register/', '/user/login/', '/goods/index/',
'goods/detail/.*', '/cart/.*']
for check_path in not_need_check:
if re.match(check_path, path):
當前path路徑為不需要做登陸校驗的路由请契,則直接訪問對應頁面
return None
if not user_id:
當前path路徑為不需要做登陸校驗的路由,則直接訪問對應頁面
return HttpResponseRedirect(reverse('user:login'))
3中間件同步數(shù)據(jù)庫與session中的數(shù)據(jù)
class SessionToMiddleware(MiddlewareMixin):
def process_response(self, request, response):
同步session中的商品信息和數(shù)據(jù)庫中購物車表的商品信息
1.判斷用戶是否登陸,登陸才做數(shù)據(jù)同步操作
user_id = request.session.get('user_id')
if user_id:
2.同步
2.1判斷session中的商品是否存在于數(shù)據(jù)庫中份乒,如果存在腿堤,則更新
2.2如果不存在,則創(chuàng)建
2.3同步數(shù)據(jù)庫的數(shù)據(jù)到session中
session_goods = request.session.get('goods')
if session_goods:
將session中的數(shù)據(jù)同步到數(shù)據(jù)庫
for se_goods in session_goods:
# se_goods結構為[goods_id,num,is_select]
cart = ShoppingCart.objects.filter(user_id=user_id, goods_id=se_goods[0]).first()
if cart:
更新商品信息
if cart.nums != se_goods[1] or cart.is_select != se_goods[2]:
cart.nums = se_goods[1]
cart.is_select = se_goods[2]
cart.save()
else:
創(chuàng)建
ShoppingCart.objects.create(user_id=user_id, goods_id=se_goods[0],
nums=se_goods[1], is_select=se_goods[2])
同步數(shù)據(jù)庫的數(shù)據(jù)到session中
db_carts=ShoppingCart.objects.filter(user_id=user_id)
組裝多個商品格式:[[goods_id,num,is_select],[goods_id,num,is_select]]
if db_carts:
new_session_goods = [[cart.goods_id, cart.nums, cart.is_select] for cart in db_carts]
request.session['goods'] = new_session_goods
return response
4商品結算總價及小計
cart.goods_price = price波势;給cart添加一個小計的屬性并賦值
def place_order(request):
if request.method == 'GET':
獲取當前登陸系統(tǒng)的用戶對象
user = request.user
carts = ShoppingCart.objects.filter(user=user, is_select=True).all()
計算小計和總價
total_price = 0
for cart in carts:
小計金額
price = cart.goods.shop_price * cart.nums
給cart添加一個小計的屬性并賦值
cart.goods_price = price
總金額
total_price += price
return render(request, 'place_order.html', {'carts': carts, 'total_price': total_price, 'num': len(carts)})