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 相关文章推荐
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
python读取文本中的坐标方法
Oct 14 Python
python实现列表的排序方法分享
Jul 01 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 Python
如何基于python实现归一化处理
Jan 20 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
python 对一幅灰度图像进行直方图均衡化
Oct 27 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 31 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 URL验证正则表达式
2011/07/19 PHP
基于php权限分配的实现代码
2013/04/28 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
短信提示使用 特效
2007/01/19 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
JavaScript中pop()方法的使用教程
2015/06/09 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
Angular的$http与$location
2016/12/26 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
Python字符串的常见操作实例小结
2019/04/08 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
用Python写一个自动木马程序
2019/09/17 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
试用期工作表现自我评价
2015/03/06 职场文书
中小企业员工手册范本
2015/05/14 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫