Локальная переменная 'user' ссылается перед ошибкой присваивания в функции django

У меня есть функция в 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]))

Функция 'get' в Django ORM может вызвать исключение, если запрашиваемый объект отсутствует в базе данных, вы можете убедиться в существовании объекта 'user' до перехода к следующей строке с помощью простой логики вроде этой (я переименовал его в 'wishlist' в соответствии с именем модели):

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)

Обратите внимание, что ваши соглашения об именовании могут немного вводить в заблуждение. И еще, вам нужна такая же логика для объекта 'listing' после 'user'.

Как подсказывает ошибка, просто отнесите ее перед присвоением к пустой строке в самом начале метода POST, так:

def add_or_remove(request, listing_id):
    if request.method == "POST":
        user=""
        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]))
Вернуться на верх