Django添加商品到购物篮时出现'Basket'无save属性的AttributeError
问题根因
你遇到的AttributeError: 'Basket' object has no attribute 'save'报错,核心原因是你在Basket类的add()方法末尾调用了self.save(),但你没有在Basket类中定义对应的save()方法。
修复方案
打开basket/basket.py文件,在Basket类中补充save()方法即可:
class Basket(): def __init__(self, request): # 原有__init__逻辑保持不变 self.session = request.session basket = self.session.get('skey') if 'skey' not in request.session: basket = self.session['skey'] = {} self.basket = basket # 新增save方法 def save(self): # 标记session已被修改,触发Django的session持久化逻辑 self.session.modified = True def add(self, product, qty): # 原有add逻辑保持不变 ... # 其余原有方法逻辑均不改动 ...
可选优化建议
basket/views.py中获取购物篮总数量的写法可以调整为Python规范写法,将basketqty = basket.__len__()替换为basketqty = len(basket),你已经实现了__len__魔术方法,直接调用len()即可,无需手动调用魔术方法。
补充说明
你将购物篮数据存储在Session中,当你修改Session内嵌套的skey字典内部值时,Django默认不会自动检测到这类嵌套改动,必须手动将session.modified设置为True,才能让Django将改动后的Session数据持久化存储,这也是save()方法的核心作用。
内容的提问来源于stack exchange,提问作者Delroy Brown
相关产品推荐
相关产品推荐

