Django中add_or_remove函数局部变量'user'未赋值引用错误修复
Django心愿单add_or_remove函数首次添加报错修复
你的分析完全正确:新用户首次添加商品时,由于Wishlist记录尚未创建,try块执行失败进入except分支,但分支里仅创建了create变量,未给user赋值就直接调用user.item.add(listing),触发了未定义变量的错误。同时代码还有其他潜在问题(比如裸except会捕获所有异常、Listing获取逻辑位置不合理),以下是完整修复方案:
关键修复点
- 将
Listing.objects.get()移到try块外,确保无论Wishlist是否存在,商品实例都能先被正确获取,避免因商品不存在进入except分支导致listing未定义 - 替换裸except为捕获特定的
Wishlist.DoesNotExist异常,避免误捕获无关错误(比如数据库连接异常) - 在except分支中,创建Wishlist实例后将其赋值给变量,再执行商品关联操作
- 给remove分支添加异常处理,避免用户无Wishlist或商品不在心愿单时触发报错
修复后的完整代码
from django.shortcuts import get_object_or_404, redirect, reverse from django.contrib import messages from .models import Wishlist, Listing def add_or_remove(request, listing_id): if request.method == "POST": # 先获取商品实例,不存在直接返回404页面 listing = get_object_or_404(Listing, pk=listing_id) if request.POST["action"] == "add": try: user_wishlist = Wishlist.objects.get(user=request.user) user_wishlist.item.add(listing) messages.success(request, '已添加到心愿单') except Wishlist.DoesNotExist: # 创建Wishlist并关联商品,create方法自动保存无需手动调用save() user_wishlist = Wishlist.objects.create(user=request.user) user_wishlist.item.add(listing) messages.success(request, '已添加到心愿单') elif request.POST["action"] == "remove": try: user_wishlist = Wishlist.objects.get(user=request.user) user_wishlist.item.remove(listing) messages.success(request, '已从心愿单移除') except (Wishlist.DoesNotExist, Listing.DoesNotExist): # 捕获无心愿单或商品不在心愿单的情况,给出友好提示 messages.warning(request, '该商品不在你的心愿单中') return redirect(reverse("listing", args=[listing_id]))
额外优化说明
- 使用
get_object_or_404获取Listing,商品不存在时直接返回标准404页面,比get()更友好 - 将变量名从
user改为user_wishlist,避免和request.user混淆,提升代码可读性 - 移除了冗余的
save()调用,objects.create()会自动完成保存操作 - 给remove分支补充异常捕获,覆盖了用户无心愿单或商品不在心愿单的场景,避免页面崩溃
内容的提问来源于stack exchange,提问作者kroma235
相关产品推荐
相关产品推荐

