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

首先是产品目录界面中的”加入购物车“链接,我们希望点击这个按钮后,在购物车中添加该产品(添加的规则是如果购物车中已经有该产品就增加数量,如果没有就增加条目),然后显示购物车。首先我们设计一个”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 %}

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

Django实战(14):让页面联动起来的更多相关文章

  1. Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接

    在文章 Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接(一) 中我们成功的为/feedback/feedback_stats/路径自定义了使用tem ...

  2. [实战]MVC5+EF6+MySql企业网盘实战(14)——逻辑重构

    写在前面 上篇文章关于修改文件夹和文件名称导致的找不到物理文件的问题,这篇文章将对其进行逻辑的修改. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6 ...

  3. 非等高cell实战--实现微博页面

    代码地址如下:http://www.demodashi.com/demo/11639.html 前言 学习过UITableView.AutoLayout以及MVC的相关知识,接下来通过一个微博页面实战 ...

  4. 从零开始部署Django生产环境(适用:《跟老齐学Python Django实战》)

    <跟老齐学Python Django实战>作为市面上少有的Django通俗实战书籍,给了我学习Django很大的帮助.作为一名新入门的菜鸟,全书我重复练习了至少三遍,每次都有新的收获. 前 ...

  5. django xadmin中logout页面在chrome浏览器中点击关闭页面无效

    问题现象 django xadmin中logout页面在chrome浏览器中点击关闭页面无效,无法关闭相应的页面 问题原因 高版本的chrome等浏览器不支持在window.colse()的写法 问题 ...

  6. django 从零开始 4 404页面和500页面设置

    在视图函数中定义两个 函数 分别对应404 个500页面 (自定义html内容吧,这里只是展示) 在template页面指向自己定义的404.html和500.html页面 在项目的urls中设置 h ...

  7. Django实战(一)-----用户登录与注册系统3(前端页面、登录视图)

    基本框架搭建好了后,我们就要开始丰富页面内容了.最起码,得有一个用户登录的表单不是么?(注册的事情我们先放一边.) 一. 原生HTML页面 删除原来的login.html文件中的内容,写入下面的代码: ...

  8. mxonline实战14,全局搜索,修改个人中心页面个人资料信息

    对应github地址:第14天   一. 全局搜索   1. 使用关键词搜索 courses/views.py/CourseListView新增代码,不用把search_keywords传到前端

  9. 5、Django实战第5天:首页和登录页面的配置

    从这天开始我们需要用到前端源码,需要的朋友可以进行小额打赏(15元),打赏二维码在博客的右侧,打赏后可以凭截图联系463951510@qq.com,博主收到邮件后会立即回复发送所有源码素材,实战过程中 ...

随机推荐

  1. SFTP上传下载文件、文件夹常用操作

    SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd  d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文 ...

  2. python安装pymssql

    安装pymssql pip install pymssql 关于python安装pymssql报错export PYMSSQL_BUILD_WITH_BUNDLED_FREETDS=1 然后再 pip ...

  3. 哈密顿图 哈密顿回路 哈密顿通路(Hamilton)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5452580.html 概念: 哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,就是哈密顿回路.存在哈密顿回 ...

  4. 初等数论及其应用——Lucas定理

    Lucas定理用于解决较大组合数的取模问题,下面的理论整理源自冯志刚的<初等数论>,其与百度百科上呈现的Lucas定理形式上不同,但是容易看到二者的转化形式. 首先我们来整理一下冯志刚的& ...

  5. TPS低,CPU高--记一次storm压测问题排查过程

    一.业务背景+系统架构 本次场景为kafka+storm+redis+hbase,通过kafka的数据,进入storm的spout组件接收,转由storm的Bolt节点进行业务逻辑处理,最后再推送进k ...

  6. Elasticsearch技术解析与实战(五)Document解析

    1.手动指定document id 一般来说,是从某些其他的系统中,导入一些数据到es时,会采取这种方式,就是使用系统中已有数据的唯一标识,作为es中document的id. PUT /index/t ...

  7. 51nod1312 最大异或和

    题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320  有一个正整数数组S,S中有N个元素,这些元素分别是S[0],S[1],S[2]...,S[N-1]. ...

  8. HDU 4720 Naive and Silly Muggles 平面几何

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4720 解题报告:给出一个三角形的三个顶点坐标,要求用一个最小的圆将这个三个点都包含在内,另外输入一个点 ...

  9. 产品排序 product

    评测传送门 [问题描述] 你是一个公司的员工,你会按时间顺序受到一些产品的订单,你需要用一个栈来改变这些订单的顺序(每个产品都必须入栈和出栈一次). 按初始顺序,每次可以将一个产品入栈,或将栈顶产品弹 ...

  10. Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

    问题: 当我们打开数据库,即use dbname时,要预读数据库信息,当使用-A参数时,就不预读数据库信息. 解决方法:mysql -hhostname -uusername -ppassword - ...