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基础教程之类class定义使用方法
Feb 20 Python
python多线程用法实例详解
Jan 15 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
python后端接收前端回传的文件方法
Jan 02 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
python画图把时间作为横坐标的方法
Jul 07 Python
python实现tail -f 功能
Jan 17 Python
python 负数取模运算实例
Jun 03 Python
python em算法的实现
Oct 03 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
python脚本定时发送邮件
Dec 22 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模板之Phpbean的目录结构
2008/01/10 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
跟我学Laravel之路由
2014/10/15 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
学习ExtJS table布局
2009/10/08 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
Node.js实现注册邮箱激活功能的方法示例
2018/03/23 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
对django 模型 unique together的示例讲解
2019/08/06 Python
Keras搭建自编码器操作
2020/07/03 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
产品促销活动策划书
2014/01/15 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
美德好少年主要事迹
2014/01/29 职场文书
运动会入场解说词
2014/02/07 职场文书
社区护士演讲稿
2014/08/27 职场文书
二胎满月酒致辞
2015/07/29 职场文书
Jsonp劫持学习
2021/04/01 PHP
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers