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

Django模板渲染报错'NoneType'对象无'price'属性如何解决?

错误根因

报错触发自OrderItem模型的get_total属性中的self.product.price调用:

  1. OrderItem的product外键设置了on_delete=models.SET_NULL, null=True,当你删除过任意关联了OrderItem的Product数据时,对应OrderItem的product字段会被自动置为None,访问None的price属性就会触发该报错
  2. 代码中还存在2个隐藏问题:
    • Order模型的shipping方法调用了i.product.digital,但你给出的Product模型未定义digital字段,后续会触发属性不存在错误
    • 模板中的checkout跳转链接语法错误,缺少模板标签闭合符号

解决方案

1. 清理现有脏数据

进入Django shell执行以下命令,删除所有关联产品已失效的订单项:

from store.models import OrderItem
OrderItem.objects.filter(product__isnull=True).delete()

2. 修复get_total属性的空值判断

修改OrderItem的get_total逻辑,增加空值兼容:

@property
def get_total(self):
    if self.product:
        return self.product.price * self.quantity
    return 0

3. 修复shipping方法逻辑

增加空值判断,同时兼容digital字段不存在的情况(如果确实需要该字段请自行在Product模型中补加digital = models.BooleanField(default=False)定义):

@property
def shipping(self):
    shipping = False
    orderitems = self.orderitem_set.all()
    for i in orderitems:
        if i.product and not getattr(i.product, 'digital', False):
            shipping = True
    return shipping

4. 可选根源性优化

如果你不需要保留产品删除后的对应订单项,可将OrderItem的product外键级联策略改为删除同步删除,从根源避免product为空的情况:

product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)

5. 修复模板语法错误

将模板中的checkout链接修改为正确的Django模板标签写法:

<a href="{% url 'checkout' %}" class="btn animate">Checkout</a>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:15:04