1
- from django .shortcuts import render
1
+ from django .shortcuts import render , redirect
2
2
3
3
from cart .models import Goods
4
4
@@ -8,9 +8,68 @@ def index(request):
8
8
return render (request , 'goods.html' , {'goods_list' : goods_list })
9
9
10
10
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
13
34
35
+ def remove_item (self , id ):
36
+ if id in self .items :
37
+ self .items .remove (id )
14
38
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