小编典典

在 django 函数中的赋值错误之前引用的局部变量“用户”

all

我在 django 中有这个函数,它向愿望清单添加了一个新项目,该函数正在做它应该做的事情,但是当我添加一个未注册的新用户时,当将一个项目添加到愿望清单时它会返回这个错误,但是当我刷新页面错误不再存在。

我认为问题是当一个新用户注册时,他仍然没有在wishlist模型中创建数据库,所以try:条件失败,因为该用户在模型中尚不存在,传递了用户所在的except:条件数据库已创建,但我必须手动刷新页面,以便页面不再显示错误。

如何解决此问题,以使页面不再显示此错误?

def add_or_remove(request, listing_id):
    if request.method == "POST":
        if (request.POST["action"]) == "add":
            try:
                user = Wishlist.objects.get(user=request.user)
                listing = Listing.objects.get(pk=listing_id)
                user.item.add(listing)
            except:
                create = Wishlist(
                user=request.user,
                )
                create.save()
                user.item.add(listing)
                messages.success(request, 'you added to Wishlist')

        elif (request.POST["action"]) == "remove":
            user = Wishlist.objects.get(user=request.user)
            item = user.item.get(id=listing_id)
            user.item.remove(item)

            messages.success(request, 'you removed from Wishlist')

        return redirect(reverse("listing", args=[listing_id]))

阅读 63

收藏
2022-08-15

共1个答案

小编典典

当请求的对象不在数据库中时,Django ORM 的 ‘get’ 函数可能会引发异常,您可以在进入下一行之前确保存在 ‘user’ 对象,然后使用这样的简单逻辑(我已将其重命名为’愿望清单’根据型号名称):

try:
   wishlist = Wishlist.objects.get(user=request.user)
except Wishlist.DoesNotExist:
   wishlist = Wishtlist(user=request.user)
   wishlist.save()

或者,您可以使用 Django 的内置 get_or_create() 函数,该函数开箱即用地执行相同的操作。

wishlist = Wishlist.objects.get_or_create(user=request.user)

请注意,您的命名约定可能有点误导。而且,对于“用户”之后的“列表”对象,您需要相同的逻辑。

2022-08-15