我在 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]))
当请求的对象不在数据库中时,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)
请注意,您的命名约定可能有点误导。而且,对于“用户”之后的“列表”对象,您需要相同的逻辑。