Django实战(13):在session中保存购物车

微信小程序 + Django 在线点餐系统:从建表到部署的完整实践 前后端分离是现代Web开发的主流架构,前端负责交互展示,后端提供数据接口。微信小程序作为轻量级前端载体,在企业应用中广泛使用;Django作为Python全栈框架,以其高效的ORM和DRF快速构建RESTful API著称。在在线点餐场景中,两者结合能实现从菜单浏览、购物车到订单状态流转的完整业务闭环。本文围绕这一技术组合,深入讲解数据模型设计、接口权限控制、订单幂等性处理等工程实践,并分享前后端联调与部署上线的关键避坑点,帮助开发者理解如何将理论技术落地为可运行的商业系统。 阅读详情

现在,我们有了一个产品目录界面,用户如果看到满意的产品,就可以将其放入购物车。下面就让我们来实现购物车的功能。


首先要做一下简单的分析和设计。购物车应该显示一系列产品的清单,其中列出了买方选中的产品。但是这个清单没有必要马上保存到数据库,因为直到付款之前,用户随时都有可能改变主意。我们只需要在用户的session中记录这些产品就可以了。

购物车中的条目
购物车中的条目与产品(Product)很类似,但是我们没有必要将这些信息再重复记录一次,而只需要让条目关联到产品即可。此外在条目中还会记录一些产品中没有的信息,比如数量。最后,我们想要在条目中记录一下单价——虽然产品中包含了价格信息,但是有时候可能会有一些折扣,所以需要记录下来用户购买时的价格。基于这些分析,我们设计了条目这一模型类:

class LineItem(models.Model):
    product = models.ForeignKey(Product)
    unit_price = models.DecimalField(max_digits=8,decimal_places=2)
    quantity = models.IntegerField()

购物车
购物车是这些条目的容器。我们希望实现一个“聪明的”购物车,它可以有自己的一些行为:比如,如果放入已经有的产品,就更改该产品的数量而不是再增加一个条目;能够查询当前购物车中的产品数量,等等。所以购物车也应该是一个模型类。但是与LineItem不同,购物车并不需要记录到数据库中,就好像超市并不关注顾客使用了哪量购物车而只关注他买了什么商品一样。所以购物车不应该继承自models.Model,而仅仅应该是一个普通类:
class Cart(object):
    def __init__(self, *args, **kwargs):
        self.items = []
        self.total_price = 0
    def add_product(self,product):
        self.total_price += product.price
        for item in self.items:
            if item.product.id == product.id:
                item.quantity += 1 
                return
        self.items.append(LineItem(product=product,unit_price=product.price,quantity=1))

在我们设计模型的同时,界面设计师也为我们设计好了购物车的界面:

接下来就可以实现url映射,view函数和模板。首先我们希望购物车的url为”http://localhost:8000/depotapp/cart/view/“,这需要在depotapp/urls.py的urlpatterns中增加一行:

(r'cart/view/', view_cart),
然后在depotapp/views.py中定义视图函数。注意购物车是保存在session中的,需要通过request.session.get获取:

def view_cart(request):
    cart = request.session.get("cart",None)
    t = get_template('depotapp/view_cart.html')

    if not cart:
        cart = Cart()
        request.session["cart"] = cart
            
    c = RequestContext(request,locals())        
    return HttpResponse(t.render(c))

最后实现模板界面:

{% extends "base.html" %}

{% block title %} 我的购物车{% endblock %}

{% block pagename %} 我的购物车  {% endblock %}

{% block content %} 
<div class="row">
          <div class="span10">
            <table class="condensed-table">
		      <thead>
		        <tr>
		          <th class="header">数量</th>
		          <th class="yellow header">名称</th>
		          <th class="blue header">单价</th>

		          <th class="green header">小计</th>
		        </tr>
		      </thead>
		      <tbody>
			  {% for item in cart.items %}
				<tr>
		          <th>{{item.quantity}}</th>
		          <td>{{item.product.title}}</td>

		          <td>{{item.unit_price}}</td>
		          <td>{% widthratio item.quantity 1 item.unit_price %} </td>
		        </tr>
			  {% endfor %}
				<tr>
		          <th></th>
		          <td></td>
		          <th>总计:</th>

		          <th>{{cart.total_price}}</th>
		        </tr>
		      </tbody>
		    </table>
			

          </div>
          <div class="span4">
            <p><a class="btn primary span2" href="#">继续购物</a></a> </p>
			<p><a class="btn danger span2" href="#">清空购物车</a></p>
			<p><a class="btn success span2" href="#">结算</a> </p>
			
          </div>
        </div>
{% endblock %}

这里面有一个技巧。因为Django模板的设计理念是”业务逻辑应该和表现逻辑相对分开“,所以在Django模板中不建议执行过多的代码。在计算条目小计的时候,使用的是Django模板的widthratio标签。该标签的原意是按比例计算宽度:根据当前值(this_value)和最大值(max_value)之间的比例,以及最大宽度(max_width)计算出当前的宽度(this_width),即{% widthratio this_value max_value max_width %} = max_width * this_value / max_value。但是如果我们设定max_value=1,就可以通过width ratio在Django模板中进行乘法计算了。同理还可以进行除法计算。

而总计价格的计算是通过模型(Cart)类实现的。现在是广告时间,很高兴地发现有人转载了本”实战“系列,但是没有给出原文地址。关于Django系列的文章会不断更新和完善,敬请到原始地址http://blog.youkuaiyun.com/thinkinside围观!

为Django增加session支持

好了,我们已经做了大量的工作,现在让我们欣赏一下自己的作品。但是启动server并访问http://localhost:8000/depotapp/cart/view/时,却提示”找不到django_session表“。这是因为Django对session的支持是通过内置的django.contrib.sessions应用实现的,该应用会将session数据保存在数据库中。但是创建project是Django并没有默认安装该app——Django不会瞒着你做任何事情。所以如果我们”显式地“决定要使用session,需要更改project的设置,在depot/settings.py的INSTALLED_APPS中去掉session的注释:

INSTALLED_APPS = (
    #'django.contrib.auth',
    #'django.contrib.contenttypes',
    'django.contrib.sessions',
    #'django.contrib.sites',
    #'django.contrib.messages',
    #'django.contrib.staticfiles',
    
	# Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
	 'depot.depotapp',
	 'django-groundwork',
)

然后还要同步一下数据库:

$ python manage.py syncdb
Creating tables ...
Creating table django_session
Installing custom SQL ...
Installing indexes ...
No fixtures found.

这是再启动服务器,就可以看到我们实现的购物车了。但是这个购物车能看不能用,无法将商品加入购物车,也无法从中去掉商品。下一节,让我们继续完善购物车的功能。


Python Django实现简单购物车功能 立即下载

相关推荐

深入解析AutoConfigURL劫持:从注册表权限到一键修复

本文深入解析了AutoConfigURL劫持的原理,揭示其通过篡改注册表权限锁定浏览器设置的机制。文章提供了从手动修复注册表权限到使用一键修复工具的详细解决方案,并指导用户进行DNS检查与病毒查杀,以彻底根除此类顽固劫持问题。

weixin_29229989的博客 765

Django接口平台开发问题记录(一)(sessionStorage存取数据)

Django接口平台开发问题记录(一) 在html界面中关于使用sessionStorage传值问题 场景:想要实现在表格中点击一条接口数据跳转到执行界面时将数据信息自动添加到对应的文本框中 选择使用sessionStorage来实现本地存取数据: table.on('tool(demo)', function (obj) { var data = obj.data; if (obj.event === 'perform') { var stora

qq_42238292的博客 600

瑞芯微RK3506开发板DSM音频开发避坑指南:从硬件改接到内核配置全流程

本文详细解析了在瑞芯微RK3506开发板上进行DSM音频开发的完整流程与关键避坑点。内容涵盖从硬件改造(如电阻焊接)、内核驱动配置(DTS参数、补丁应用)到系统调试与波形分析的全过程,旨在帮助嵌入式开发者高效实现高信噪比、低成本的音频方案,避免常见错误。

weixin_29164091的博客 406

Django深入研究5(常用的Web应用程序)

常用的Web应用程序 一、会话控制 二、缓存机制 三、CSRF防护 四、消息提示 五、分页功能   Django为开发者提供了常见的Web应用程序,如会话控制、高速缓存、CSRF防护、消息提示和分页功能。内置的Web应用程序大大优化了网站性能,并且完善了安全防护机制,而且也提高了开发者的开发效率。

Itsme_MrJJ的博客 1893

android11-修改屏幕显示方向和触摸方向

参数0表示12点钟方向显示参数90表示3点钟方向显示参数180表示6点钟方向显示参数270表示9点钟方向显示。

Paper_Love的博客 2118

深入解析EDID中Display Descriptor Block的配置技巧与实战应用

本文深入解析EDID中Display Descriptor Block的配置技巧与实战应用。通过剖析像素时钟、有效像素、消隐区与同步脉冲等核心参数,并结合1280x720@60Hz的实战配置案例,指导开发者如何正确为定制硬件或非标准显示器编写“身份证”,避免黑屏、分辨率异常等问题,确保显示设备完美点亮。

1a2s3d4f5g的博客 878

Django使用session管理购物车

购物车允许用户选择产品并设置他们想要订购的数量,然后在他们浏览网站时临时存储这些信息,直到最终下订单。购物车必须在会话中持久化,以便在用户访问期间维护购物车项目。

旁门贰号 1635

Python - 多页pdf 合称为一页

尝试使用 ReportLab 来重画 pdf,但探索起来有点麻烦。重要的是解决手头这个问题,所以就算方法蠢,但简单完事。以下生成结果,最有一页 pdf 可能会显示在第一页,手动编辑下 pdf 即可;或者你也可以修改代码逻辑来完善。打印ppt,一页占用A4纸比较浪费,想多页合成一个 A4大小;安装 fitz,单独安装 fitz 使用可能会报错。将 PDF 拆分为 图片来保存。

AI工程化、开源分享、文档翻译、代码笔记 1425

Django中的session,和cookie机制

Cookie和Session 实现用户跟踪 如今,一个网站如果不通过某种方式记住你是谁以及你之前在网站的活动情况,失去的就是网站的可用性和便利性,继而很有可能导致网站用户的流式,所以记住一个用户(更专业的说法叫用户跟踪)对绝大多数Web应用来说都是必需的功能。 在服务器端,我们想记住一个用户最简单的办法就是创建一个对象,通过这个对象就可以把用户相关的信息都保存起来,这个对象就是我们常说的sessi...

qq_42992919的博客 606

手把手教你学simulink实例--基于Simulink的船舶发电柴油机建模与健康状态研究

船舶发电柴油机是现代船舶电力系统的核心设备,为船舶提供稳定的电能供应。然而,由于长期运行在复杂的海洋环境中,船舶发电柴油机容易受到磨损、腐蚀和疲劳等损伤的影响,导致其性能下降甚至发生故障。因此,对船舶发电柴油机进行建模和健康状态监测具有重要意义。本项目旨在使用MATLAB/Simulink平台,建立船舶发电柴油机的动力学模型,并通过仿真分析其健康状态,预测潜在故障,从而提高船舶运行的安全性和经济性。

MHD0815的博客 1323

老 Intel Mac mini 装 OpenClaw:低成本常年在线方案

老款Intel Mac mini部署OpenClaw方案摘要 本文详细介绍了如何利用老款Intel Mac mini低成本部署OpenClaw系统。方案推荐2011-2018款Mac mini,建议升级至16GB内存和SSD存储以提升性能。部署步骤包括:1)安装Ubuntu系统;2)配置Docker环境;3)通过docker-compose部署OpenClaw及其依赖组件(PostgreSQL和Redis);4)进行系统级和Docker层面的性能优化;5)设置开机自启动服务。该方案充分利用老款设备剩余价值,

一键难忘的博客 2476

Django用户登录认证系统分析和应用

Django 用户登录认证系统 1. django认证系统默认配置 django框架安装后就自动带有一个用户认证系统和后台管理网站,帮助开发者使用。 1.1. 默认认证系统内容 django默认已经提供了认证系统Auth模块。认证系统包含: 用户管理 权限 用户组 密码哈希系统 用户登录或内容显示的表单和视图 一个可插拔的后台系统 admin 1.2. 默认认证系统用户模型 Django认证系统中提供了用户模型类User保存用户的数据,默认的User包含以下常见的基本字段: 字段名 字段描述

qq_35125180的博客 984

OFDM调制解调系统信道估计和均衡算法的MATLAB仿真

然后,从接收到的信号中提取导频序列,并使用LS算法进行信道估计。OFDM(正交频分复用)是一种常用于高速数据传输的调制技术,它将高速数据流分割成多个低速子载波,通过在不同的子载波上传输数据,实现了频域上的正交性。因此,信道估计和均衡算法在OFDM系统中起着至关重要的作用,用于减小信道衰落引起的影响。通过运行上述代码,可以进行基于LS算法的OFDM调制解调系统信道估计和均衡的MATLAB仿真。本文将介绍一种基于LS(最小二乘)算法的OFDM调制解调系统信道估计和均衡算法,并提供相应的MATLAB仿真代码。

uote_e的博客 229

从弓箭到AI:技术哲学视角下的工具演化史与人类认知边界

本文从技术哲学视角探讨了从弓箭到AI的工具演化史,揭示了工具如何不断突破人类认知与行动的边界。通过分析物理层面和认知层面的延伸,以及工业革命和数字时代的范式转变,文章深入探讨了技术对社会结构、思维方式和人类本质的深远影响,特别关注了AI在认知延伸中的新维度和未来挑战。

weixin_33743703的博客 379

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《Django 5 By Example》阅读笔记:p339-p358

vt. to persuade sb forcefully to do sth(强制)。

codists的博客 1312

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

从 0 开始学习 Django:用一个商城项目理解 Web 后端开发

本文介绍了使用Django框架入门Web开发的完整指南。主要内容包括:1. 推荐项目驱动学习方式,以商城系统为例讲解典型功能开发流程;2. 详解Django运行机制(MVT模式)及核心文件作用;3. 从创建项目到开发商品功能的完整步骤;4. 数据库模型设计思路和迁移操作;5. 视图函数与模板的交互方法;6. 用户系统、购物车、订单等核心功能实现;7. 推荐了一个适合初学者的商城项目实例;8. 常见错误解决方案和学习路线建议。文章强调通过实践项目理解Django的完整开发流程,特别适合Python初学者系统学

2401_87918926的博客 152

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Django—Cookie and Session

一、Cookie Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。 1. 应用 服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。 Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时...

weixin_30342827的博客 71

python框架Django实战商城项目之工程搭建

项目说明 该电商项目类似于京东商城,主要模块有验证、用户、第三方登录、首页广告、商品、购物车、订单、支付以及后台管理系统。 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用jinja2模板引擎实现,局部刷新采用vue.js实现。 项目运行机制如下: 项目搭建 工程创建 项目使用码云进行源代码版本控制,在码云创建好后直接克隆到本地即可,然后在项目根目录下执行virtual...

测试轩 1280

实战——python框架Django商城项目之工程搭建

项目说明 该电商项目类似于京东商城,主要模块有验证、用户、第三方登录、首页广告、商品、购物车、订单、支付以及后台管理系统。 项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用jinja2模板引擎实现,局部刷新采用vue.js实现。 项目运行机制如下: 项目搭建 工程创建 项目使用码云进行源代码版本控制,在码云创建好后直接克隆到本地即可,然后在项目根目录下执行 virtualenv venv创建虚拟环境,source venv/bin/activat激活虚拟环境后,安装django后

Asaasa1的博客 641

Django花卉电商系统开发与毕业设计实践

电商系统开发是Web应用开发的重要领域,基于Python的Django框架因其完善的ORM系统和内置功能模块,成为构建复杂业务系统的首选方案。本文以花卉电商平台为例,详解如何利用Django的MTV架构实现商品管理、用户系统和订单处理等核心模块,特别针对花卉类商品的时效性需求设计了保鲜期提醒功能。通过Bootstrap实现响应式前端布局,结合Django ORM处理复杂的商品分类关系,项目展示了电商系统开发的典型技术栈和业务逻辑处理方法。对于计算机专业学生,这类包含远程调试支持和完整文档体系的毕业设计项目,

weixin_33980459的博客 506

Python+Django构建智能宠物商城系统实战

电商推荐系统是提升用户购物体验的核心技术,其原理是通过算法分析用户行为和商品特征实现精准匹配。基于协同过滤和深度学习的混合推荐策略能显著提升点击率,结合时间序列预测可优化库存管理。本文以宠物行业为例,详细解析如何用Django框架集成Scikit-learn和TensorFlow实现商品智能推荐、销量预测等AI功能,其中三级推荐策略组合使CTR提升65%,RFM模型帮助商家实现顾客分层运营。系统采用PostgreSQL存储宠物特征数据,通过FastAPI服务化AI模块,为中小型零售企业提供了可落地的智能化升

weixin_34315485的博客 370

python django实战_python框架Django实战商城项目之工程搭建

项目说明该电商项目类似于京东商城,主要模块有验证、用户、第三方登录、首页广告、商品、购物车、订单、支付以及后台管理系统。项目开发模式采用前后端不分离的模式,为了提高搜索引擎排名,页面整体刷新采用jinja2模板引擎实现,局部刷新采用vue.js实现。项目运行机制如下:项目搭建工程创建项目使用码云进行源代码版本控制,在码云创建好后直接克隆到本地即可,然后在项目根目录下执行virtualenv ven...

weixin_39841572的博客 175
上一篇: Django实战(12):增加目录页,设定统一布局
下一篇: Django实战(14):让页面联动起来
ThinkInside
博客等级 码龄19年 281粉丝 93原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值