You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python的Django商品加入购物车功能实现求助

问题:Django实现商品添加到购物车函数

我是Python和Django新手,希望实现点击“加入购物车”按钮时,获取商品ID并将商品添加到用户购物车的简单函数。已创建Cart和Product模型,但无法完成添加商品到购物车的函数编写,现有部分代码如下,寻求指导:

class Cart(models.Model):
    cart_id = models.Charfield(primary_key=True)
    total = models.DecimalField(max_digits=9,decimal_places=2)  
    quantity = models.IntegerField()  
    products = models.ManyToManyField(Product)

class Product(models.Model):
    prod_id = models.CharField(max_length=15, null=True)
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10,decimal_places=2)  
    description = models.TextField(max_length=1000)

def cart_add(request, prod_id):
    item = Product.objects.get(pk=prod_id)

希望能得到完成该函数的帮助。

解决方案

首先修正模型里的拼写错误:models.Charfield应该是models.CharField(注意大小写)。接下来从模型优化、函数完善、前端配置三个部分给出实现方案:

1. 优化模型(贴合实际购物场景)

原Cart模型无法记录单个商品的购买数量,且直接存储quantity和total易出现数据不一致问题,建议新增中间表CartItem来关联购物车与商品,同时记录单商品数量:

from django.db import models
import uuid

class Product(models.Model):
    prod_id = models.CharField(max_length=15, null=True, unique=True)
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)  
    description = models.TextField(max_length=1000)

class Cart(models.Model):
    cart_id = models.CharField(primary_key=True, max_length=50)
    total = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
    quantity = models.IntegerField(default=0)

class CartItem(models.Model):
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    class Meta:
        unique_together = ('cart', 'product')  # 确保同一款商品在购物车中仅存一条记录

2. 完成cart_add视图函数

核心逻辑:获取/创建购物车、处理商品添加(数量累加或新增)、更新购物车统计数据:

from django.shortcuts import get_object_or_404, redirect
import uuid

def cart_add(request, prod_id):
    # 获取目标商品,不存在则返回404页面
    product = get_object_or_404(Product, prod_id=prod_id)
    
    # 从Session获取购物车ID,无则生成唯一ID
    cart_id = request.session.get('cart_id')
    if not cart_id:
        cart_id = str(uuid.uuid4())
        request.session['cart_id'] = cart_id
        cart = Cart.objects.create(cart_id=cart_id)
    else:
        # 兼容Session存在但数据库记录丢失的情况
        cart, created = Cart.objects.get_or_create(cart_id=cart_id)
    
    # 处理商品:已存在则数量+1,不存在则新建
    cart_item, item_created = CartItem.objects.get_or_create(cart=cart, product=product)
    if not item_created:
        cart_item.quantity += 1
        cart_item.save()
    
    # 更新购物车总数量与总价
    cart.quantity = sum(item.quantity for item in cart.cartitem_set.all())
    cart.total = sum(item.product.price * item.quantity for item in cart.cartitem_set.all())
    cart.save()
    
    # 重定向回商品页面(替换为你的实际URL名称)
    return redirect('product_detail', prod_id=prod_id)

3. 前端按钮与路由配置

在商品详情页添加“加入购物车”按钮(建议用POST请求避免重复提交):

<form action="{% url 'cart_add' prod_id=product.prod_id %}" method="post">
    {% csrf_token %}
    <button type="submit" class="btn btn-primary">加入购物车</button>
</form>

在urls.py中配置对应路由:

from django.urls import path
from . import views

urlpatterns = [
    # ... 其他路由
    path('cart/add/<str:prod_id>/', views.cart_add, name='cart_add'),
]

关键注意点

  • 用get_object_or_404替代Product.objects.get(),避免商品不存在时抛出服务器错误,返回404页面更友好。
  • 用Session跟踪匿名用户购物车,后续支持登录用户时,可将购物车关联到User模型。
  • CartItem的unique_together约束避免同一款商品在购物车中生成多条重复记录。

内容的提问来源于stack exchange,提问作者marshmeloBall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:31:06