Django购物车Session问题:无法正确回显添加的商品信息
问题分析与修复方案
你的问题核心是Session存储结构和模板渲染逻辑不匹配:
- 你把商品名称、价格分别存在
request.session['nom']和request.session['prix']两个独立键中,它们的值都是单个字符串/数字,并非包含nom和prix的完整对象 - 模板循环
request.session.items时,每个value都是单个值,自然找不到value.nom和value.prix,导致内容为空
修复步骤
1. 修改视图函数cart_add
将选中的完整商品对象存入Session(以下先针对单商品场景修复,多商品场景附在后面):
def cart_add(request, code): dico={'produits':[{'code':'2BG12','nom':'banane sucré','prix':1500}, {'code':'MLO23','nom':'pomme de terre','prix':1800}]} mes_produits=dico['produits'] selected_product = next((item for item in mes_produits if item["code"] == code), None) if selected_product: # 把完整商品对象存入session的单个键中 request.session['cart_item'] = selected_product # 处理商品不存在的情况,避免KeyError context = {'cart_item': request.session.get('cart_item', {})} return render(request, 'cart/cart_detail.html', context)
2. 修改cart_detail.html模板
直接渲染Session中存储的完整商品对象,无需循环整个Session:
{% if cart_item %} Nom : {{ cart_item.nom }} Prix : {{ cart_item.prix }} {% else %} 购物车为空 {% endif %}
可选:多商品购物车适配
如果需要支持添加多个商品,可将Session改为列表结构存储:
def cart_add(request, code): dico={'produits':[{'code':'2BG12','nom':'banane sucré','prix':1500}, {'code':'MLO23','nom':'pomme de terre','prix':1800}]} mes_produits=dico['produits'] selected_product = next((item for item in mes_produits if item["code"] == code), None) if selected_product: # 从session获取购物车列表,不存在则初始化空列表 cart = request.session.get('cart', []) # 可选:避免重复添加同一件商品 if not any(item['code'] == code for item in cart): cart.append(selected_product) request.session['cart'] = cart context = {'cart': request.session.get('cart', [])} return render(request, 'cart/cart_detail.html', context)
对应多商品模板:
{% if cart %} {% for item in cart %} Nom : {{ item.nom }} Prix : {{ item.prix }}<br> {% endfor %} {% else %} 购物车为空 {% endif %}
内容的提问来源于stack exchange,提问作者Khalifa
相关产品推荐
相关产品推荐

