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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:23:01