一 模型類的設(shè)計(jì)
-
設(shè)計(jì)兩個數(shù)據(jù)類一個訂單信息表,一個訂單詳情表
model.py from django.db import models # Create your models here. class OrderInfo(models.Model): oid = models.CharField(max_length=20,primary_key=True) user = models.ForeignKey('df_user.UserInfo') odate = models.DateTimeField(auto_now=True) oIsPay = models.IntegerField(default=0) ototal = models.DecimalField(max_digits=6,decimal_places=2) oaddress = models.CharField(max_length=150,default='') zhifu = models.IntegerField(default=0) class OrderDetailInfo(models.Model): goods=models.ForeignKey('df_goods.GoodsInfo') order=models.ForeignKey(OrderInfo) price=models.DecimalField(max_digits=5,decimal_places=2) count=models.IntegerField()
二 views功能的設(shè)計(jì)
-
views中定義了order和order_handle兩個函數(shù)
views.py from django.shortcuts import render # Create your views here. from django.shortcuts import render,redirect from django.db import transaction from datetime import datetime from decimal import Decimal from df_cart.models import CartInfo from .models import OrderInfo,OrderDetailInfo from df_user.islogin import islogin from df_goods.models import GoodsInfo from df_user.models import UserInfo from django.http import JsonResponse # Create your views here. @islogin def order(request): """ 此函數(shù)用戶給下訂單頁面展示數(shù)據(jù) 接收購物車頁面GET方法發(fā)過來的購物車中物品的id,構(gòu)造購物車對象供訂單使用 """ uid = request.session.get('user_id') user = UserInfo.objects.get(id=uid) # 獲取勾選的每一個訂單對象,構(gòu)造成list,作為上下文傳入下單頁面 orderid = request.GET.getlist('orderid') orderlist = [] for id in orderid: orderlist.append(CartInfo.objects.get(id=int(id))) # 判斷用戶手機(jī)號是否為空,分別做展示 if user.uphone == '': uphone = '' else: uphone = user.uphone[0:4] + \ '****' + user.uphone[-4:] # 構(gòu)造上下文 context = {'title': '提交訂單', 'page_name': 1, 'orderlist': orderlist, 'user': user, 'ureceive_phone': uphone} return render(request, 'df_order/place_order.html', context) #--------------------------------------------什么裝飾器?->事務(wù) 一旦有一步操作失敗,則回滾全部操作 @transaction.atomic() @islogin def order_handle(request): #保存一個事物點(diǎn) tran_id = transaction.savepoint() #接收購物車編號 # 根據(jù)POST和session獲取信息 # cart_ids=post.get('cart_ids') try: post = request.POST orderlist = post.getlist('id[]') total = post.get('total') address = post.get('address') order=OrderInfo() now=datetime.now() uid = request.session.get('user_id') order.oid='%s%d'%(now.strftime('%Y%m%d%H%M%S'),uid) order.user_id=uid order.odate=now order.ototal=Decimal(total) order.oaddress = address order.save() # 遍歷購物車中提交信息,創(chuàng)建訂單詳情表 for orderid in orderlist: cartinfo = CartInfo.objects.get(id=orderid) # good = GoodsInfo.objects.get(cartinfo__id=cartinfo.id) good = GoodsInfo.objects.get(pk=cartinfo.goods_id) # print '*'*10 # print cartinfo.goods_id # 判斷庫存是否夠 if int(good.gkucun) >= int(cartinfo.count): # 庫存夠,移除購買數(shù)量并保存 good.gkucun -= int(cartinfo.count) good.save() goodinfo = GoodsInfo.objects.get(cartinfo__id=orderid) # 創(chuàng)建訂單詳情表 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() # 循環(huán)刪除購物車對象 cartinfo.delete() else: # 庫存不夠出發(fā)事務(wù)回滾 transaction.savepoint_rollback(tran_id) # 返回json供前臺提示失敗 return JsonResponse({'status': 2}) except Exception as e: print ('==================%s'%e) transaction.savepoint_rollback(tran_id) # 返回json供前臺提示成功 return JsonResponse({'status': 1})