Django实战(14):让页面联动起来
上一节我们实现了一个”能看不能用“的购物车,现在我们来使用这个购物车。
首先是产品目录界面中的”加入购物车“链接,我们希望点击这个按钮后,在购物车中添加该产品(添加的规则是如果购物车中已经有该产品就增加数量,如果没有就增加条目),然后显示购物车。首先我们设计一个”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):让页面联动起来的更多相关文章
- Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接
在文章 Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接(一) 中我们成功的为/feedback/feedback_stats/路径自定义了使用tem ...
- [实战]MVC5+EF6+MySql企业网盘实战(14)——逻辑重构
写在前面 上篇文章关于修改文件夹和文件名称导致的找不到物理文件的问题,这篇文章将对其进行逻辑的修改. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6 ...
- 非等高cell实战--实现微博页面
代码地址如下:http://www.demodashi.com/demo/11639.html 前言 学习过UITableView.AutoLayout以及MVC的相关知识,接下来通过一个微博页面实战 ...
- 从零开始部署Django生产环境(适用:《跟老齐学Python Django实战》)
<跟老齐学Python Django实战>作为市面上少有的Django通俗实战书籍,给了我学习Django很大的帮助.作为一名新入门的菜鸟,全书我重复练习了至少三遍,每次都有新的收获. 前 ...
- django xadmin中logout页面在chrome浏览器中点击关闭页面无效
问题现象 django xadmin中logout页面在chrome浏览器中点击关闭页面无效,无法关闭相应的页面 问题原因 高版本的chrome等浏览器不支持在window.colse()的写法 问题 ...
- django 从零开始 4 404页面和500页面设置
在视图函数中定义两个 函数 分别对应404 个500页面 (自定义html内容吧,这里只是展示) 在template页面指向自己定义的404.html和500.html页面 在项目的urls中设置 h ...
- Django实战(一)-----用户登录与注册系统3(前端页面、登录视图)
基本框架搭建好了后,我们就要开始丰富页面内容了.最起码,得有一个用户登录的表单不是么?(注册的事情我们先放一边.) 一. 原生HTML页面 删除原来的login.html文件中的内容,写入下面的代码: ...
- mxonline实战14,全局搜索,修改个人中心页面个人资料信息
对应github地址:第14天 一. 全局搜索 1. 使用关键词搜索 courses/views.py/CourseListView新增代码,不用把search_keywords传到前端
- 5、Django实战第5天:首页和登录页面的配置
从这天开始我们需要用到前端源码,需要的朋友可以进行小额打赏(15元),打赏二维码在博客的右侧,打赏后可以凭截图联系463951510@qq.com,博主收到邮件后会立即回复发送所有源码素材,实战过程中 ...
随机推荐
- 转:动态计算UITableViewCell高度详解
转自:http://www.cocoachina.com/industry/20140604/8668.html 不知道大家有没有发现,在iOS APP开发过程中,UITableView是我们显示 ...
- codevs 3235 战争
3235 战争 http://codevs.cn/problem/3235/ 时间限制: 2 s 空间限制: 128000 KB 题目描述 Description 2050年,人类与外星人之间 ...
- windows git gui右键sublime打开当前文件编辑
git安装目录\Git\libexec\git-core\git-gui.tcl的 proc create_common_diff_popup 下追加: $ctxm add command \ -la ...
- centos6安装elasticsearch6.0
环境准备 1台centos6操作系统主机,关闭selinux及iptables官方下载elasticsearch6.0软件包:https://artifacts.elastic.co/...官方下载j ...
- 20155117王震宇实验四 Andoid开发基础实验报告
实验内容 1.Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: - ...
- HDU 4825 Xor Sum (裸字典树+二进制异或)
题目链接 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将 ...
- python概念-Socket到底有多骚
Socket究竟是什么呢? 简单来说Socket就是用来完成客户端与服务器之间的通信 例如浏览器访问网页,例如网络游戏等一切基于客户端服务器来实现的C/S架构程序 Socket是基于互联网OSI七层协 ...
- CMD命令利用tasklist与taskkill关闭程序
昨天远程服务器后,服务器无故卡住了,鼠标各种延迟与无反应,想在进程管理器里关闭程序也卡住,想点击重启系统也卡死无反应.纠结后win+R打开了cmd用shutdown重启才算搞定.重启期间思考了下,如何 ...
- STL容器基本功能与分类
STL有7中容器. 分别为: vector 向量 <vector>(头文件) 随机访问容器.顺序容器 deque 双端队列 <deque> 随机访问容器.顺序容器 list ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...