Django 5.1.4中'WSGIRequest'对象无'get'属性错误排查(购物车Session存储问题)
Django 5.1.4中'WSGIRequest'对象无'get'属性错误排查(购物车Session存储问题)
嘿,我一眼就瞅到问题的根源了!你遇到的'WSGIRequest' object has no attribute 'get'错误,根本不是Cart类的__init__方法的问题,而是视图里初始化表单时传错了参数!
错误原因分析
看你的视图代码:
def add_to_cart_view(request, product_id): cart = Cart(request) product = get_object_or_404(Product, id=product_id) form = AddToCartProductForm(request) # 这里错了! if form.is_valid(): cleaned_data = form.cleaned_data quantity = cleaned_data['quantity'] cart.add(product, quantity) return redirect('cart:cart-detail')
AddToCartProductForm是表单类,初始化时需要传入表单提交的数据(比如request.POST),而你直接传了request对象。表单内部会默认把传入的参数当成字典去调用get方法获取字段值,可WSGIRequest对象根本没有get方法,这就导致了报错。
第一步:修复视图中的表单初始化
把表单初始化代码改成这样:
def add_to_cart_view(request, product_id): cart = Cart(request) product = get_object_or_404(Product, id=product_id) # 只在POST请求时传入表单数据,GET请求时创建空表单 form = AddToCartProductForm(request.POST or None) if request.method == 'POST' and form.is_valid(): cleaned_data = form.cleaned_data quantity = cleaned_data['quantity'] cart.add(product, quantity) return redirect('cart:cart-detail') return redirect('cart:cart-detail')
用request.POST or None的好处是:GET请求时会创建空表单,POST请求时才传入提交的数据,避免GET请求时表单报错;加上request.method == 'POST'的判断,也更符合Django的视图规范。
第二步:补充Cart类缺失的save方法
你在Cart类的add方法里调用了self.save(),但代码里根本没有实现这个方法!这会导致修改后的购物车数据无法保存到Session中,用户刷新页面后购物车就空了。赶紧加上:
class Cart: def __init__(self, request): """ Initialize The Cart """ self.request = request self.session = request.session cart = self.session.get('cart') if not cart: cart = self.session['cart'] = {} self.cart = cart # add a product to session cart: def add(self, product, quantity=1): """ Add The Specified Product To The Cart If Exists """ product_id = str(product.id) if product_id not in self.cart: self.cart[product_id] = {'quantity': quantity} else: self.cart[product_id]['quantity'] += quantity self.save() # 确保save方法存在 # 新增save方法 def save(self): """ Mark the session as modified to ensure changes are saved """ self.session.modified = True
Django的Session需要手动标记为已修改(session.modified = True),否则它不会自动保存字典类型的修改,这个细节很关键!
其他检查点
- 你的Cart类__init__方法的两种写法都是没问题的,不用改;
- HTML模板里的表单action、method、csrf_token都正确,这部分无需调整;
- 确认你的
Product模型存在id字段(默认Django模型都自带,不过还是可以核对下)。
按照上面的步骤修改后,应该就能解决这个错误,并且购物车数据能正常保存到Session里了!
备注:内容来源于stack exchange,提问作者Aminsnaie
相关产品推荐
相关产品推荐

