Django實戰(14):讓頁面聯動起來


上一節我們實現了一個”能看不能用“的購物車,現在我們來使用這個購物車。

首先是產品目錄界面中的”加入購物車“鏈接,我們希望點擊這個按鈕后,在購物車中添加該產品(添加的規則是如果購物車中已經有該產品就增加數量,如果沒有就增加條目),然后顯示購物車。首先我們設計一個”RESTful“的加入購物車鏈接,其形式是:
http://localhost:8080/depotapp/cart/add/xxx
其中xxx為產品的ID。
這需要在depotapp/urls.py中增加一條配置:

[python] view plain copy
  1. (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中:

[python] view plain copy
  1. def add_to_cart(request,id):
  2. product = Product.objects.get(id = id)
  3. cart = request.session.get("cart",None)
  4. ifnot cart:
  5. cart = Cart()
  6. request.session["cart"] = cart
  7. cart.add_product(product)
  8. request.session['cart'] = cart
  9. 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:

[python] view plain copy
  1. (r'cart/clean/', clean_cart),

view函數:

 

 

[python] view plain copy
  1. def clean_cart(request):
  2. request.session['cart'] = Cart()
  3. return view_cart(request)


view_cart.html模板中的鏈接:

 

{% url depotapp.views.clean_cart %}

請自己將這些內容加入相關文件,即可實現”清空購物車“的功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM