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 相关文章推荐
详解C++编程中一元运算符的重载
Jan 19 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 Python
python3下实现搜狗AI API的代码示例
Apr 10 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
Dec 19 Python
python单例设计模式实现解析
Jan 07 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
appium+python adb常用命令分享
Mar 06 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
Python使用itcaht库实现微信自动收发消息功能
Jul 13 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
js实现拖拽效果
2015/02/12 Javascript
jQuery动态添加
2016/04/07 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
浅谈Nodejs中的作用域问题
2016/12/26 NodeJs
简单谈谈原生js的math对象
2017/06/27 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
Python for循环生成列表的实例
2018/06/15 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
numpy基础教程之np.linalg
2019/02/12 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
环境工程毕业生自荐信
2013/11/17 职场文书
关于建议书的格式范文
2014/05/20 职场文书
十佳青年事迹材料
2014/08/21 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
教师求职信怎么写
2015/03/20 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
MongoDB支持的数据类型
2022/04/11 MongoDB