Локальная переменная '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]))