django会话框架创建购物车系统

本文详细介绍了如何在Django项目中使用会话框架创建和管理购物车,包括配置会话引擎、设置自定义会话密钥、创建购物车应用和管理类,以及涉及的视图和模板。
摘要由CSDN通过智能技术生成

会话框架简介

你好!Django 是支持匿名会话的。会话框架允许您基于每个站点访问者存储和检索任意数据。它在服务器端存储数据并提供cookie的发送和接收。Cookie包含会话ID - 而不是数据本身(除非您使用基于cookie的后端)。

配置会话引擎

默认情况下,Django 在数据库里存储会话(使用 django.contrib.sessions.models.Session )。虽然这很方便,但在一些设置里,在其他地方存储会话数据速度更快,因此 Django 可以在文件系统或缓存中配置存储会话数据。:

  1. 使用数据库支持的会话 如果你想使用数据库支持的会话,你需要在 INSTALLED_APPS 里添加 ‘django.contrib.sessions’ 。
    一旦在安装中配置,运行 manage.py migrate 来安装单个数据库表来存储会话数据。;
  2. 使用缓存会话 可查看官网文档
  3. 使用基于文件的会话
  4. 使用基于cookie的会话
    本项目使用默认会话,数据库支持会话

会话常用语句

request.sesion[settings.CART_SESSION_ID] = {}#新建会话
request.session.get(settings.CART_SESSION_ID)#会话密钥检索方式
del request.session.cart[product_id]# 删除存储在会话中的密钥

将购物车存储在会话中

购物车工作方式:

  1. 当使用购物车时,需要先检测自定义会话密钥是否存在。不存在就新建购物车,并且将购物车和购物车内容一并存入购物车会话密钥中。

设置自定义会话密钥

settings.py文件中写入

CART_SESSION_ID = 'cart'

创建购物车app

django常规创建app并激活,在此不做赘述

 django-admin startapp cart
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'shop.apps.ShopConfig',
    ->'cart.apps.CartConfig',
    'orders.apps.OrdersConfig',
    'payment.apps.PaymentConfig',
    'coupons.apps.CouponsConfig',
    'rosetta',
    'parler',
]

创建购物车管理类

1.通过request对象初始化购物车,若是当前对象购物车为空,则新建购物车即在会话中设置一个空字典
2.将商品ID作为键,将商品数量和价格作为值,防止重复添加
3.实现添加购物车、清空购物车、计算购物车总价、删除购物车某个商品

from django.conf import settings
from shop.models import Product
from decimal import Decimal as dec
from coupons.models import Coupon
from decimal import Decimal


class Cart(object):
    def __init__(self, request) -> None:
    	# 获取当前会话
        self.sesion = request.session
        cart = self.sesion.get(settings.CART_SESSION_ID)
        if not cart:
            cart = self.sesion[settings.CART_SESSION_ID] = {}
        self.cart = cart
        self.coupon_id = self.sesion.get('coupon_id')

    def save(self):
        # 会话对象它已经被修改 当设置为 True 时,Django 会根据每个请求将会话保存到数据库中。
        self.sesion.modified = True

    def add(self, product, quantity=1, override_quantity=False):
        product_id = str(product.id)
        if product_id not in self.cart:
            self.cart[product_id] = {'quantity': 0, 'price': str(product.price)}
        if override_quantity:
            self.cart[product_id]['quantity'] = quantity
        else:
            self.cart[product_id]['quantity'] += quantity
        self.save()

    def remove(self, product):
        product_id = str(product.id)
        if product_id in self.cart:
            del self.cart[product_id]
        self.save()

    def __iter__(self):
        product_ids = self.cart.keys()
        products = Product.objects.filter(id__in=product_ids)
        cart = self.cart.copy()
        for product in products:
            cart[str(product.id)]['product'] = product
        for item in cart.values():
            item['price'] = dec(item['price'])
            item['total_price'] = (item['price']) * item['quantity']
            # 生成器
            yield item

    def __len__(self):
        return sum(item['quantity'] for item in self.cart.values())

    def get_total_price(self):
        return sum(dec(item['price']) * item['quantity'] for item in self.cart.values())

    def clear(self):
        del self.sesion[settings.CART_SESSION_ID]
        self.save()

    @property
    def coupon(self):
        if self.coupon_id:
            try:
                return Coupon.objects.get(id=self.coupon_id)
            except Coupon.DoesNotExist:
                pass
        return None

    def get_discount(self):
        if self.coupon:
            return self.get_total_price() - (self.coupon.discount / Decimal(100)) * self.get_total_price()
        return Decimal(0)

    def get_total_price_after_discount(self):
        return self.get_total_price() - self.get_discount()

创建购物车

不想做赘述

创建购物车视图模板

不想做赘述

创建购物车视图url

不想做赘述
项目链接添加链接描述

本课程是一个系列的django实战进阶开发教程,目标是带领大家快速上手实战,课程以最新版本django3.2为蓝本,深入django源码本身,通过内置的类视图来开发,即CBV模式开发,从最基础的类显示视图到类编辑视图再到混入视图,由浅入深,专注Django的高级知识,带你系统的玩转Django,无过多的依赖第三方库,进一步降低学习门槛,更加专注django框架本身!本课程将带你实现一个功能完备的商城系统,如:新闻管理、商品管理(包含多规格)、订单管理、购物车、快速下单、评论、地址、运费模板等常见的商城功能!除此之外,你还可以将本课程内容中涉及到的django类视图的高级用法作为参考资料,在以后的开发中用到的时候再翻阅。认真看完这个系列视频教程之后,您会深入理解django框架的高级知识以及开发流程,具备使用django上手开发实际项目的基本能力!本课程亮点一、少量的第三方依赖,降低学习门槛开发过程中依赖第三方库少,减少大家的进一步的学习理解成本,从而更加专注django框架本身!二、前端轻度结合vue.js,无需过多前端技能本项目将轻度结合vue.js以及fetch来完成一些异步请求,无需过多vue 知识,更贴合后端开发者,也更加靠近当下最热门的技术栈,为前后端分离项目开发打下坚实的基础!三、采用django本身序列化方法构造json,深入django框架本身深度使用Django本身的序列化器来序列化数据,构造一些异步操作的接口,通过这一深度使用对未来使用drf框架将打下坚实的基础,学习drf框架将变的非常容易。四、CBV模式开发,深入Django类视图本项目全部采用Django的类视图,深入学习类视图,不同的请求我们可以在类中使用不同的方法来处理,这样大大的提高了代码的可读性以及高度扩展性,更加便于二次开发!五、多规格产品功能,更符合实际需求网上千篇一律的教程都没有深入讲解多规格商品的实现思路,本专栏将手把手带你完成多规格功能,并且对JD及TB的两种多规格模式的利弊进行深入剖析!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值