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

Django电商网站结账页购物车不显示及订单无法生成问题

Django电商网站核心问题修复方案

问题1:结账页面无法显示购物车商品

根源分析

urls.py中存在重复路由名称,导致正确的checkout视图被覆盖:

path('checkout/', checkout, name='checkout'),
path('login/', auth_views.LoginView.as_view(template_name='home/checkout.html'), name='checkout'),

第二条路由的name='checkout'会覆盖第一条,用户访问/checkout/时实际调用的是Django内置的LoginView,而该视图不会向模板传递cart_items变量,因此页面无法渲染购物车内容。

修复步骤

修改urls.py中的login路由,修正名称和模板:

# 替换原login路由
path('login/', auth_views.LoginView.as_view(template_name='home/login.html'), name='login'),

确保home/login.html存在(可创建简单的登录表单模板,或复用现有模板结构),避免与checkout视图冲突。


问题2:提交订单后无订单记录,CartItem未删除

根源分析

存在多个触发事务回滚的错误:

  1. 自定义User模型无username字段:checkout视图中尝试访问user.username,但自定义User的唯一标识是phone_number,此处会抛出AttributeError,导致事务回滚,订单创建失败。
  2. 数据类型不匹配:total_price是float类型,而Order模型的order_price是DecimalField,直接赋值会触发类型错误,导致事务回滚。
  3. 表单字段冗余:checkout.html中包含必填的receiver字段,但视图未处理该字段,且Order模型无对应字段,浏览器强制校验会导致表单提交受阻(或提交后无影响,但属于无效逻辑)。

修复步骤

1. 修正User模型字段引用

修改views.py中checkout视图的日志代码:

# 替换原日志行
logger.info(f"Checkout initiated for user: {user.phone_number}")

2. 修正价格数据类型

导入Decimal并重新计算total_price,避免类型不匹配:

# 在views.py顶部导入Decimal
from decimal import Decimal

# 修改checkout视图中的价格计算逻辑
total_price = Decimal('0.00')
for item in cart_items:
    # 将float类型的product.price转为Decimal,避免精度丢失
    item_total = Decimal(str(item.product.price)) * item.quantity
    total_price += item_total

3. 处理冗余表单字段

方案A:添加receiver字段到Order模型

  • 在models.py的Order类中添加字段:
    receiver = models.CharField(max_length=100)
    
  • 执行数据库迁移:python manage.py makemigrations && python manage.py migrate
  • 在checkout视图的POST处理中获取receiver并传入Order创建:
    address = request.POST.get('address')
    payment_choice = request.POST.get('payment_choice')
    receiver = request.POST.get('receiver')  # 新增此行
    
    # 创建Order时传入receiver
    order = Order.objects.create(
        user=user,
        address=address,
        receiver=receiver,  # 新增此行
        payment_choice=payment_choice,
        order_price=total_price
    )
    

方案B:删除模板中的receiver字段
直接移除checkout.html中的以下代码:

<label for="receiver">receiver:</label><br>
<textarea name="receiver" required></textarea><br>

验证步骤

  1. 重启本地服务器,清除浏览器缓存。
  2. 登录后添加商品到购物车,访问/checkout/确认商品正常显示。
  3. 填写表单提交订单,检查Django后台是否生成Order和OrderItem记录,同时确认CartItem已被删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:23:13