Django 实现购物车功能的完整指南
本文详细介绍如何在 Django 中实现购物车功能。通过配置 SESSION_EXPIRE_AT_BROWSER_CLOSE 控制会话生命周期,利用 django-cart 模块简化商品增删查逻辑。涵盖 urls.py 路由配置、视图函数编写及 cart.html 模板展示,帮助开发者快速构建暂存商品、查看订单的电商核心模块。
购物车的核心思路在于利用 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 文件中配置三条 URL 规则,分别对应购物车中的添加商品、删除商品以及查看购物车功能。
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 %}
前端页面显示效果如下:

至此,购物车功能开发完成。后续可在此基础上继续实现订单处理、支付功能等模块。
以上就是本文的全部内容,希望能为各位的学习提供有益帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









