Django实战(14):让页面联动起来

上一节我们实现了一个”能看不能用“的购物车,现在我们来使用这个购物车。

首先是产品目录界面中的”加入购物车“链接,我们希望点击这个按钮后,在购物车中添加该产品(添加的规则是如果购物车中已经有该产品就增加数量,如果没有就增加条目),然后显示购物车。首先我们设计一个”RESTful“的加入购物车链接,其形式是:
http://localhost:8080/depotapp/cart/add/xxx
其中xxx为产品的ID。
这需要在depotapp/urls.py中增加一条配置:

[python] view plaincopy
  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 plaincopy
  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 plaincopy
  1. (r'cart/clean/', clean_cart),

view函数:

 

 

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


view_cart.html模板中的链接:

 

{% url depotapp.views.clean_cart %}

请自己将这些内容加入相关文件,即可实现”清空购物车“的功能。

posted @ 2012-02-19 22:58  心内求法  阅读(6727)  评论(1编辑  收藏  举报