96SEO 2026-08-06 07:24 15
上一篇我们完成了购物车模型的最终设计,还跑通了单元测试。今天模型里的字段将真正“活”起来——我们要实现购物车的完整增删改查。包括从商品详情页一键加入购物车、在购物车页面调整数量、勾选结算、删除商品,还有全选和合计金额的实时计算。
这篇代码量不小。前端交互也比较丰富,但每一步我都会把逻辑讲透。跟上节奏,做完这一篇,你的电商项目就已经能跑通“选商品 → 加购物车 → 改数量”的完整闭环了。

使用者痛点:经常遇到「加入购物车后页面刷新」或「数量修改后合计不更新」的问题,这会导致购买体验大幅下降。
我们今天要实现的功能清单:
痛点提醒:忘记在根路由中 include 导致 404。是新手常见错误,其实,
# apps/cart/urls.py
from django.urls import path
from . import views
app_name = 'cart'
urlpatterns =
# django_ecommerce/urls.py
from django.urls import path。include
urlpatterns =
常见坑点:
# apps/cart/views.py
from django.shortcuts import render,get_object_or_404
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from .models import CartItem
from products.models import SKU
@login_required
def cart_list:
"""购物车列表页"""
cart_items = CartItem.objects.filter\
.select_related.prefetch_related
total_price = sum
total_count = sum
return render(request,'cart/cart_list.html',{
'cart_items': cart_items,'total_price': total_price,'total_count': total_count,})
@require_POST
@login_required
def cart_add:
"""加入购物车"""
sku_id = request.POST.get
quantity = int)
if not sku_id:
return JsonResponse
sku = get_object_or_404
if quantity> sku.stock:
return JsonResponse({'ok': False,'msg': f'库存不足'},status=400)
cart_item,created = CartItem.objects.get_or_create(
user=request.user,sku=sku,defaults={'quantity': quantity}
)
if not created:
new_quantity = cart_item.quantity + quantity
if new_quantity> sku.stock:
return JsonResponse({'ok': False,'msg': f'库存不足'},status=400)
cart_item.quantity = new_quantity
cart_item.save
return JsonResponse({
说到'ok',True,'msg': '已加入购物车','cart_count': request.user.cart_items.count
})
@require_POST
@login_required
def cart_update:
"""更新购物车商品数量"""
cart_item = get_object_or_404
action = request.POST.get # increase / decrease / set
quantity = request.POST.get
if action == 'increase':
new_qty = cart_item.quantity + 1
elif action == 'decrease':
new_qty = cart_item.quantity - 1
‑elif action == 'set' and quantity:
new_qty = int
再看‑else,return JsonResponse
‑if new_qty <= 0:
‑return JsonResponse({'ok': False,
’msg’: ’数量不能小于1‘}, status=400)
‑if new_qty> cart_item.sku.stock:
‑return JsonResponse({'ok': False。’msg’: f'库存不足‘},status=400)
‑cart_item.quantity = new_qty
‑cart_item.save
‑checked_items = request.user.cart_items.filter.select_related
‑total_price = sum
‑return JsonResponse({
说到’ok’,True,’new_quantity’: cart_item.quantity,’subtotal’: float,’total_price’: float,})
@require_POST
@login_required
def cart_delete:
"""删除单个商品"""
item = get_object_or_404
item.delete
checked_items = request.user.cart_items.filter.select_related
total_price = sum
return JsonResponse({'ok': True,'msg': '已删除','total_price': float})
@require_POST
@login_required
def cart_batch_delete:
"""批量删除勾选的商品"""
item_ids = request.POST.getlist
if item_ids:
CartItem.objects.filter(pk__in=item_ids,user=request.user).delete
checked_items = request.user.cart_items.filter.select_related
total_price = sum
return JsonResponse({'ok': True,'msg': '已删除选中商品','total_price': float})
@require_POST
@login_required
def cart_check:
"""切换单个商品的勾选状态"""
item = get_object_or_404
item.is_checked = not item.is_checked
item.save
checked_items = request.user.cart_items.filter.select_related
total_price = sum
return JsonResponse({
'ok'这方面,True,'is_checked': item.is_checked,'total_price': float,'checked_count': checked_items.count,'all_checked': not request.user.cart_items.filter.exists,})
@require_POST
@login_required
def cart_check_all:
"""全选或取消全选"""
checked = request.POST.get == 'true'
request.user.cart_items.update
total_price = 0.0
if checked:
items = request.user.cart_items.select_related
total_price = sum
return JsonResponse({
再看'ok',True,'total_price': float,'checked_count':
request.user.cart_items.filter.count if checked else 0,})
视图关键点:
"item_ids" 数组。
{% extends 'base.html' %}
{% load static %}
{% block title %}我的购物车{% endblock %}
{% block content %}
🛒 我的购物车
{% if cart_items %}
商品信息
单价
数量
小计
操作
{% for item in cart_items %}
{{ item.sku.specs_display }}
{{ item.sku.price }} 元
已选择{{ total_count }}件,去结算⽬标!<>
{% else %}
你的購物車是空空如也哦~⽂本!
?,./",去逛逛↑↓↑↓←→←→←→↑↓↑↓↑↓↲↳↘ ↙ ↚ ↛ ↜ ↝ ↞ ↟ ↠ ➤ ➥ ➦ ➧ ⇐ ⇒ ⇔ ⇕ ⇖ ⇗ ⇘ ⇙ ⟳ ⟲ ◼ ◻ □ ▪ ▫ ▬ ▶ ◀ ► ◄ △ ▴ ▼ ▾ ▲ △ ▼ ◇ ○ ◎ ● ★ ☆ ❖ ☀ ☁ ☂ ☃ ⚡ ♠ ♣ ♥ ♦ ♪ ♩ ♬ ♭ ♯ ∞ ∂ ∆ ∏ √ ≈ ≠ ≤ ≥ ≡ ≈ © ® ™ ℗ ℕ ℚ ℝ ℤ ☐ ☑ ☒ ⊗ ⊕ ÷ × ± • · …∴ ∵ ∶ ∷ ≪≫ ← → ↑ ↓ ↔ ↕ ⇒ ⇐ ⇒⇔ ←→ ←➡➡ ➸ ➹ ✎ ✍ 🔧 🛠️ 🔨 🧰 📦 💳 🛒 🎁 🚚 📦📫💼🏷️🔖🧾📋📝📂🔐🔒💡⚙️🚀✨🌟💥🔥🥇🥈🥉🏅🎖️🚩⚔️🗡️🪓🔪🪃💣🧨⚡💎👑📱📲🤖🌐💻⌨️🖱️🖥️📺🎮🎲🏁🏆🥇🥈🥉🏅🎟️🎫⚓🚢✈️🚁🚲🚗🚕🚙🚌🚎🚓🚑🚒🚚🛰️🌍🌏🌎";{% endblock %}
{% block extra_js %}
{% endblock %}
User Pain Point:AJAX 请求缺失 CSRF token 或 SKU 未匹配导致 “参数错误”。下面代码确保先获取正确 SKU 再提交,并统一使用上面封装好的 CSRF 方法。
// 获取当前选中的 SKU ID
function getCurrentSkuId{
const matched=findMatchingSku;return matched?matched.id : null;}
// 加入购物车按钮绑定事件
const addToCartBtn=document.getElementById;if{
addToCartBtn.addEventListener=>{
const skuId=getCurrentSkuId;if{
alert,return;}
// 如有数量输入框,可自行获取。此处默认 1 件
const quantity=1;fetch('{% url "cart:add" %}',{
method这方面,'POST',headers:{
'X-CSRFToken':'{{ csrf_token }}'。'Content-Type':'application/x-www-form-urlencoded'
至于},body,new URLSearchParams
})
.n)
.n(d=>{
if{
alert;// 可自行更新导航栏徽标:
// document.querySelector.textContent=d.cart_count;}else{
alert;}
}),});}
- 确保模板中按钮只有登录使用者可见:
{% if user.is_aunticated %}
{% else %}
{% endif %}
Pain Point:"导航栏始终显示为0",往往是因为没有把 count 注入 context 或者查询过于频繁导致缓存失效。这里先直接在模板里使用关联查询示例;如果性能受限,可自行实现 context processor。
购物车
% if user.is_aunticated and user.cart_items.count> 0 %
{{user.cart_items.count}}
% endif %
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback