Сайт электронной коммерции - Обновление позиций корзины в Django - PullRequest
0 голосов
/ 17 апреля 2020

UnboundLocalError at / cart / - сообщение об ошибке с веб-сайта carts / views.py ", ** строка 24, в update_cart, если нет продукта в cart.products.all (): UnboundLocalError: локальная переменная 'product', на которую ссылается до присвоения

Это сообщение об ошибке, которое я получаю, когда нажимаю кнопку "добавить в корзину" на моем веб-сайте. ** - сообщение об ошибке в терминале

views.py - вот мои взгляды на корзину. Насколько я понимаю, проблема заключается в этом файле.

from django.shortcuts import render, HttpResponseRedirect
from django.urls import reverse

# Create your views here

.

from fuisce.models import Product

from .models import Cart

def view(request):
    cart = Cart.objects.all()[0]
    context = {"cart": cart}
    template = "cart/view.html"
    return render(request, template, context)

def update_cart(request, product_id):
    cart = Cart.objects.all()[0]
    try:
        product = Product.objects.get(product_id=product_id)
    except Product.DoesNotExist:
        pass
    except:
        pass
    if not product in cart.products.all():
        cart.products.add(product)
    else:
        cart.products.remove(product)
    return HttpResponseRedirect(reverse('cart'))

***urls.py***

from django.urls import path
from . import views
from carts import views as cart_views

urlpatterns = [
    path('cart/', cart_views.view, name='cart'),
    path('cart/<product_id>', cart_views.update_cart, name='update_cart'),
]


***models.py - cart ***

from django.db import models

# Create your models here.
from fuisce.models import Product

class Cart(models.Model):
    products = models.ManyToManyField(Product)
    total = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)    
    active = models.BooleanField(default=True)

    def __string__(self):
        return "Cart id: %s" %(self.id)

***models.py -Product***
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

# Create your models here.
class Product(models.Model):
    product_id = models.AutoField
    product_name = models.CharField(max_length=50)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    desc = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
    updated = models.DateTimeField(auto_now_add=False, auto_now=True)    
    active = models.BooleanField(default=True)
    image = models.ImageField(upload_to='fuisce/images', default="")

    def __str__(self):
        return self.product_name

Я считаю, что в этих файлах есть проблема, но из исследований в Интернете я не могу точно определить, что это такое. Корзина на моем веб-сайте работала, пока я не изменил свой файл views.py. Любая помощь будет очень полезной. оценили.

1 Ответ

0 голосов
/ 17 апреля 2020

Я думаю, что проблема в том, что вы объявляете переменную product внутри блока try-кроме и не обрабатываете ошибку должным образом

def update_cart(request, product_id):
    cart = Cart.objects.all()[0]

    try:
        product = Product.objects.get(product_id=product_id)
    except Product.DoesNotExist:
        product=None
        print('Exception Occured')
    except:
        product=None
        print('Exception Occured')

    if not product in cart.products.all():
        cart.products.add(product)
    else:
        cart.products.remove(product)

    return HttpResponseRedirect(reverse('cart'))
...