Django模板渲染报错'NoneType'对象无'price'属性如何解决?
错误根因
报错触发自OrderItem模型的get_total属性中的self.product.price调用:
OrderItem的product外键设置了on_delete=models.SET_NULL, null=True,当你删除过任意关联了OrderItem的Product数据时,对应OrderItem的product字段会被自动置为None,访问None的price属性就会触发该报错- 代码中还存在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
相关产品推荐
相关产品推荐

