Django 实现购物车功能的示例代码


Posted in Python onOctober 08, 2018

购物车思路:使用 session 功能识别不同浏览器用户,使得用户不管是否登录了网站,均能够把想要购买的产品放在某个地方,之后随时可以显示或修改要购买的产品,等确定了之后再下订单,购物车可以用来暂存商品。

我们可以使用 session 为每一个用户创建一个 ID,然后以这个 ID 作为创建每一个购物车的依据。这个购物车在用户浏览过程中会保留数据,一直到实际完成下单,用户执行清除,或者关闭浏览器为止,当然,退出登录的话购物车内容也会消失不见。

在 settings.py 文件中加入下列语句,表示要求在浏览器一关闭的时候 session 就会失效。

SESSION_EXPIRE_AT_BROWSER_CLOSE = True

购物车的具体实现已经有现成的模块 django-cart 可以使用,详细用法可以参考 GitHub:https://github.com/bmentges/django-cart 。执行安装。

pip install django-cart

安装完成后我们在 settings.py 文件中 INSTALL_APPS 中加入 'cart' 模块。并执行 ./manage.py migrate 更新数据库。

在 urls.py 中增加3个网站样式,分别用来执行购物车的增加产品,删除产品以及查看购物车。

url(r'^cart/$', views.cart),
url(r'^additem/(\d+)/(\d+)/$', views.add_to_cart, name='additem-url'),
url(r'^removeitem/(\d+)/$', views.remove_from_cart, name='removeitem-url'),

我们编写 add_to_cart 函数,调用 django-cart 模块的 Cart 类,实现增加产品功能。

from cart.cart import Cart
def add_to_cart(request, product_id, quantity):
 product = models.Product.objects.get(id=product_id)
 cart = Cart(request)
 cart.add(product, product.price, quantity)
 return redirect('/')

这里记得将 cart.py 中的 import models 改为 from . import models ,否则 Python 会找不到这个模块,报错。

删除产品。

def remove_from_cart(request, product_id):
 product = models.Product.objects.get(id=product_id)
 cart = Cart(request)
 cart.remove(product)
 return redirect('/cart/')

显示购物车内容。

@login_required
def cart(request):
 all_categories = models.Category.objects.all()
 cart = Cart(request)
 template = get_template('cart.html')
 html = template.render(context=locals(), request=request)
 return HttpResponse(html)

购物车的 html 文件 cart.html 。

<!-- cart.html (mshop project) -->
{% extends "base.html" %}
{% block title %}查看购物车{% endblock %}
{% block content %}
<div class='container'>
{% for message in messages %}
 <div class='alert alert-{{message.tags}}'>{{ message }}</div>
{% endfor %}
 <div class='row'>
  <div class='col-md-12'>
   <div class='panel panel-default'>
    <div class='panel-heading' align=center>
     <h3>欢迎光临迷你小电商</h3>
      {% if user.socialaccount_set.all.0.extra_data.name %}
       {{user.socialaccount_set.all.0.extra_data.name}}<br/>
       <img src='{{user.socialaccount_set.all.0.get_avatar_url}}' width='100'>
      {% else %}
       Welcome: {{ user.username }}
      {% endif %}
    </div>
   </div>
  </div>
 </div>
 <div class='row'>
  <div class='col-sm-12'>
   <div class='panel panel-info'>
    <div class='panel panel-heading'>
     <h4>我的购物车</h4>
    </div>
    <div class='panel panel-body'>
     {% for item in cart %}
     {% if forloop.first %}
     <table border=1>
      <tr>
       <td width=300 align=center>产品名称</td>
       <td width=100 align=center>单价</td>
       <td width=100 align=center>数量</td>
       <td width=100 align=center>小计</td>
       <td width=100 align=center>删除</td>
      </tr>
     {% endif %}
      <div class='listgroup'>
       <div class='listgroup-item'>
        <tr>
         <td>{{ item.product.name }}</td>
         <td align=right>{{ item.product.price }}</td>
         <td align=center>{{ item.quantity }}</td>
         <td align=right>{{ item.total_price }}</td>
         <td align=center>
          <a href='{% url "removeitem-url" item.product.id %}'><span class='glyphicon glyphicon-trash'></span></a>
         </td>
        </tr>
       </div>
      </div>
     {% if forloop.last %}
     </table>
     <button class='btn btn-warning'><a href='/order'>我要订购</a></button>
     {% endif %}
     {% empty %}
      <em>购物车是空的</em>
     {% endfor %}
    </div>
    <div class='panel panel-footer'>
     总计:{{ cart.summary }}元
    </div>
   </div>
  </div>
 </div>
</div>
{% endblock %}

显示如下:

Django 实现购物车功能的示例代码

 至此,我们便完成了购物车功能,接下来可以实现订单功能,付款功能等等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
Python性能提升之延迟初始化
Dec 04 Python
Python实现多线程HTTP下载器示例
Feb 11 Python
python抓取文件夹的所有文件
Feb 27 Python
Python日志模块logging基本用法分析
Aug 23 Python
Python rstrip()方法实例详解
Nov 11 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
Python 批量刷博客园访问量脚本过程解析
Aug 30 Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 Python
python实现微信打飞机游戏
Mar 24 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
Python中super().__init__()测试以及理解
Dec 06 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 #Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 #Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 #Python
Python中的函数式编程:不可变的数据结构
Oct 08 #Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 #Python
JSON文件及Python对JSON文件的读写操作
Oct 07 #Python
Python实现登陆文件验证方法
Oct 06 #Python
You might like
PHP 和 MySQL 基础教程(四)
2006/10/09 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
初识PHP
2014/09/28 PHP
php自定义类fsocket模拟post或get请求的方法
2015/07/31 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
python中使用enumerate函数遍历元素实例
2014/06/16 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Python日志器使用方法及原理解析
2020/09/27 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
社团2014年植树节活动总结
2014/03/11 职场文书
机械操作工岗位职责
2014/08/08 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python
Linux中sftp常用命令整理
2022/06/28 Servers