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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:58:01