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 相关文章推荐
Python3.2中Print函数用法实例详解
May 19 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
python批量提取word内信息
Aug 09 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
Python面向对象进阶学习
May 21 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 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单例模式实现(对象只被创建一次)
2012/12/05 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
PHP的全局错误处理详解
2016/04/25 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
JavaScript类和继承 constructor属性
2010/03/04 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
详解js类型判断
2018/05/22 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
Python实现全角半角转换的方法
2014/08/18 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
解决Python中回文数和质数的问题
2019/11/24 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
南京某公司笔试题
2013/01/27 面试题
公司业务主管岗位职责
2013/12/07 职场文书
《陶罐和铁罐》教学反思
2014/02/19 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
格林童话读书笔记
2015/06/30 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书