上一節我們實現了一個”能看不能用“的購物車,現在我們來使用這個購物車。
首先是產品目錄界面中的”加入購物車“鏈接,我們希望點擊這個按鈕后,在購物車中添加該產品(添加的規則是如果購物車中已經有該產品就增加數量,如果沒有就增加條目),然后顯示購物車。首先我們設計一個”RESTful“的加入購物車鏈接,其形式是:
http://localhost:8080/depotapp/cart/add/xxx
其中xxx為產品的ID。
這需要在depotapp/urls.py中增加一條配置:
- (r'cart/view/(?P<id>[^/]+)/$', add_to_cart),
這 條url配置中使用了python正則表達式中的”命名組“。其語法是(?P<name>pattern) ,這里 name 是組的名字,而 pattern 是匹配的某個模式。命名組的作用是將pattern匹配到的字符串按照name指定的參數傳遞給view函數。在上面的配置中指定參數名稱為id。如果我 們的view函數定義為def add_to_cart(request,id)。上述的url配置會自動調用add_to_cart(request, id=xxx),其中xxx為產品的ID。(如果不使用命名組,則會調用add_to_cart(request,xxx),如果有多個參數需要通過 url匹配,就會帶來麻煩)
接下來是定義view函數,在depotapp/views.py中:
- def add_to_cart(request,id):
- product = Product.objects.get(id = id)
- cart = request.session.get("cart",None)
- ifnot cart:
- cart = Cart()
- request.session["cart"] = cart
- cart.add_product(product)
- request.session['cart'] = cart
- return view_cart(request)
根據url中的id參數獲取產品,加入購物車,然后調用view_cart視圖函數顯示購物車。這里面判斷session中是否有cart對象的寫法與上 一節的view_cart視圖函數中的寫法相同,不符合DRY的原則。為了簡單這里暫時不去管它,在后續的內容中再來重構。
要注意,從session中獲取對象后,對該對象屬性的更改不能自動同步到session中,而是需要重新寫入session。
最后就是增加鏈接,使得從產品列表頁可以直接加入購物車。使用前面介紹過的Django模板中的url表達式可以自動生成到視圖函數的鏈接,即使將來URLconf有所改變,也不需要再修改模板。同樣的道理,在購物車模板中,將”繼續購物“的鏈接改為{% url depotapp.views.store_view %},就可以自動鏈接到產品目錄視圖對應的url。
最后再實現一個”清空購物車“的功能:
url:
- (r'cart/clean/', clean_cart),
view函數:
- def clean_cart(request):
- request.session['cart'] = Cart()
- return view_cart(request)
view_cart.html模板中的鏈接:
{% url depotapp.views.clean_cart %}
請自己將這些內容加入相關文件,即可實現”清空購物車“的功能。