1- from django .shortcuts import render
1+ from django .shortcuts import render , redirect
22
33from cart .models import Goods
44
@@ -8,9 +8,68 @@ def index(request):
88 return render (request , 'goods.html' , {'goods_list' : goods_list })
99
1010
11- def show_cart (request ):
12- return render (request , 'cart.html' )
11+ class CartItem (object ):
12+ """购物车中的商品项"""
13+
14+ def __init__ (self , goods , amount = 1 ):
15+ self .goods = goods
16+ self .amount = amount
17+
18+ @property
19+ def total (self ):
20+ return self .goods .price * self .amount
21+
22+
23+ class ShoppingCart (object ):
24+ """购物车"""
25+
26+ def __init__ (self ):
27+ self .items = {}
28+
29+ def add_item (self , item ):
30+ if item .goods .id in self .items :
31+ self .items [item .goods .id ].amount += item .amount
32+ else :
33+ self .items [item .goods .id ] = item
1334
35+ def remove_item (self , id ):
36+ if id in self .items :
37+ self .items .remove (id )
1438
15- def add_to_cart (request , no ):
16- pass
39+ def clear_all_items (self ):
40+ self .items .clear ()
41+
42+ @property
43+ def cart_items (self ):
44+ return self .items .values ()
45+
46+ @property
47+ def total (self ):
48+ val = 0
49+ for item in self .items .values ():
50+ val += item .total
51+ return val
52+
53+
54+ def add_to_cart (request , id ):
55+ goods = Goods .objects .get (pk = id )
56+ # 通过request对象的session属性可以获取到session
57+ # session相当于是服务器端用来保存用户数据的一个字典
58+ # session利用了Cookie保存sessionid
59+ # 通过sessionid就可以获取与某个用户对应的会话(也就是用户数据)
60+ # 如果在浏览器中清除了Cookie那么也就清除了sessionid
61+ # 再次访问服务器时服务器会重新分配新的sessionid这也就意味着之前的用户数据无法找回
62+ # 默认情况下Django的session被设定为持久会话而非浏览器续存期会话
63+ # 通过SESSION_EXPIRE_AT_BROWSER_CLOSE和SESSION_COOKIE_AGE参数可以修改默认设定
64+ # Django中的session是进行了持久化处理的因此需要设定session的序列化方式
65+ # 1.6版开始Django默认的session序列化器是JsonSerializer
66+ # 可以通过SESSION_SERIALIZER来设定其他的序列化器(例如PickleSerializer)
67+ cart = request .session .get ('cart' , ShoppingCart ())
68+ cart .add_item (CartItem (goods ))
69+ request .session ['cart' ] = cart
70+ return redirect ('/' )
71+
72+
73+ def show_cart (request ):
74+ cart = request .session .get ('cart' , None )
75+ return render (request , 'cart.html' , {'cart' : cart })
0 commit comments