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中线程的MQ消息队列实现以及消息队列的优点解析
Jun 29 Python
Python科学计算之NumPy入门教程
Jan 15 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
Python调用微信公众平台接口操作示例
Jul 08 Python
Python 移动光标位置的方法
Jan 20 Python
python之pexpect实现自动交互的例子
Jul 25 Python
django迁移数据库错误问题解决
Jul 29 Python
Python3实现二叉树的最大深度
Sep 30 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
python中return不返回值的问题解析
Jul 22 Python
举例讲解Python装饰器
Dec 24 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
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
javascript document.images实例
2008/05/27 Javascript
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
2016/02/25 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
python实现简单温度转换的方法
2015/03/13 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
Python中字符串与编码示例代码
2019/05/20 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python 微信公众号文章爬取的示例代码
2020/11/30 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
IBatis持久层技术
2016/07/18 面试题
高三生物教学反思
2014/01/25 职场文书
小学评语大全
2014/04/22 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
触电现场处置方案
2014/05/14 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
个人授权委托书格式
2014/08/30 职场文书
万能检讨书2000字
2014/10/17 职场文书
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
关于nginx 实现jira反向代理的问题
2021/09/25 Servers