首页 > 解决方案 > 电子商务网站 - 在 Django 中更新购物车项目

问题描述

/cart/ 处的 UnboundLocalError - 来自网站 carts/views.py 的错误消息”,**第 24 行,如果 cart.products.all() 中没有产品,则在 update_cart 中:UnboundLocalError:分配前引用的局部变量“产品”

这是我在我的网站上单击“添加到购物车”按钮时收到的错误消息。** - 终端中的错误消息

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 文件。任何帮助将不胜感激。

标签: pythondjangodjango-modelsdjango-views

解决方案


我认为问题在于您product在 try-except 块中声明变量,并且没有正确处理错误

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'))

推荐阅读