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实现DNS正向查询、反向查询的例子
Apr 25 Python
Python中的ConfigParser模块使用详解
May 04 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
快速解决安装python没有scripts文件夹的问题
Apr 03 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
Python使用pydub库对mp3与wav格式进行互转的方法
Jan 10 Python
Python Pexpect库的简单使用方法
Jan 29 Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
opencv 查找连通区域 最大面积实例
Jun 04 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
如何开发一个虚拟域名系统
2006/10/09 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
用JS写的一个TableView控件代码
2010/01/23 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
JavaScript编程中的Promise使用大全
2015/07/28 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
bootstrap选项卡使用方法解析
2017/01/11 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
python正则分析nginx的访问日志
2017/01/17 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
python3对接mysql数据库实例详解
2019/04/30 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
python:动态路由的Flask程序代码
2019/11/22 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
给老师的保证书怎么写
2015/05/09 职场文书
改进工作作风心得体会
2016/01/23 职场文书
Python基础之条件语句详解
2021/06/16 Python
详解Spring事件发布与监听机制
2021/06/30 Java/Android
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle