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和GO语言实现的消息摘要算法示例
Mar 10 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
让python在hadoop上跑起来
Jan 27 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
详解Python 重学requests发起请求的基本方式
Feb 07 Python
python matplotlib实现将图例放在图外
Apr 17 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
Sep 01 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
python Zmail模块简介与使用示例
Dec 19 Python
python中numpy数组与list相互转换实例方法
Jan 29 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函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
PHP强制转化的形式整理
2020/05/22 PHP
jQuery toggle()设置CSS样式
2009/11/05 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python常用库推荐
2016/12/04 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
python修改txt文件中的某一项方法
2018/12/29 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
老师推荐信
2013/10/28 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
酒会邀请函
2015/01/31 职场文书
皇城相府导游词
2015/02/06 职场文书
英语教师个人总结
2015/02/09 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书