以前用的Ajax實例,以后用的時候可以仿照寫
JS部分
/* 下訂單觸發click事件,用來校驗訂單是否下成功,根據AJAX返回值展示不同頁面*/
$('#order_btn').click(function(){
orderid = []
$('.goods_list_td').each(function(){
orderid.push($(this).attr('id'));
});
localStorage.setItem('order_finish',2);
$.post({
url:'/order/addorder/',
dataType:'json',
type:'POST',
data:{
'csrfmiddlewaretoken': '{{ csrf_token }}',
id:orderid,
total:totalPay,
address:$('#oaddress').text(),
},
})
.done(function(data){
if(data.status == 1){
$('.popup_con p').text('訂單提交成功!');
$('.popup_con').fadeIn('fast', function() {
setTimeout(function(){
$('.popup_con').fadeOut('fast',function(){
window.location.href = '/user/user_center_order&1/';
});
},3000)
});
}
else if(data.status == 2){
$('.popup_con p').text('超出庫存請修改!');
$('.popup_con').fadeIn('fast', function() {
setTimeout(function(){
$('.popup_con').fadeOut('fast',function(){
window.location.href = '/cart/';
});
},3000)
});
}
});
});
Python代碼
def addorder(request):
"""
下訂單功能
1)根據頁面上AJAX傳來的請求,依次將價格、地址、用戶id、時間保存為一條訂單數據,訂單id由時間構建
2)由order函數傳的orderlist,由place_order.html頁面的JS構造成數組傳到本視圖,重新getlist解析為列表
作為訂單詳情頁中購物車中的每個商品
3)根據步驟2)中得到的詳細商品列表,構造訂單詳細信息表,減去相應的庫存數量
4)步驟3)執行后刪除購物車中的信息
"""
# 設置事務點,發生異常后回滾到此處
tran_id = transaction.savepoint()
# 根據POST和session獲取信息
post = request.POST
orderlist = post.getlist('id[]')
total = post.get('total')
address = post.get('address')
uid = request.session.get('userid')
time = datetime.now()
# 創建訂單表
order = OrderInfo()
order.oid = '%s%d' % (time.strftime('%Y%m%d%H%M%S'), uid)
order.user_id = uid
order.odate = time
order.ototal = Decimal(total)
order.oaddress = address
order.save()
# 遍歷購物車中提交信息,創建訂單詳情表
for orderid in orderlist:
cartinfo = CartInfo.objects.get(id=orderid)
good = GoodsInfo.objects.get(cartinfo__id=cartinfo.id)
# 判斷庫存是否夠
if int(good.gkucun) >= int(cartinfo.count):
# 庫存夠,移除購買數量并保存
good.gkucun -= int(cartinfo.count)
good.save()
goodinfo = GoodsInfo.objects.get(cartinfo__id=orderid)
# 創建訂單詳情表
detailinfo = OrderDetailInfo()
detailinfo.goods_id = int(goodinfo.id)
detailinfo.order_id = int(order.oid)
detailinfo.price = Decimal(int(goodinfo.gprice))
detailinfo.count = int(cartinfo.count)
detailinfo.save()
# 循環刪除購物車對象
cartinfo.delete()
else:
# 庫存不夠出發事務回滾
transaction.savepoint_rollback(tran_id)
# 返回json供前臺提示失敗
return JsonResponse({'status': 2})
# 返回json供前臺提示成功
return JsonResponse({'status': 1})