【问题标题】:UnboundLocalError at /cart/slug/ local variable 'product' referenced before assignment分配前引用的 /cart/slug/ 局部变量“产品”处的 UnboundLocalError
【发布时间】:2020-04-02 04:53:27
【问题描述】:

我正在尝试使用链接将商品添加到购物车,但它一直说我在分配变量之前引用了它。

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

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

models.py:

class Product2(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField()
    slug = models.SlugField()

    def __str__(self):
        return self.name        


html:

{% for product in products %}
<div>
    <h1>{{ product.name }}:  ${{ product.price }}<a href='{% url "update_cart" product.slug %}' class ='pull-right'>Add to Cart</a></h1>
</div>
{% endfor %}

我让它工作了一秒钟,但我在数据库中创建了一个新表,在适用的地方更改了名称,但现在它不起作用。

【问题讨论】:

    标签: python html django web-applications


    【解决方案1】:

    update_cart 中,如果在product = Product2.objects.get(slug = slug) 期间引发异常,则不会定义productif not product in cart.products.all() 行将引发UnboundLocalError

    您可以通过仅继续执行以下代码来解决此问题,如果没有引发异常,则使用 product

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

    这里的try/exceptelse 子句只有在try 内部的代码没有引发异常时才会执行,这意味着除非已成功定义,否则您不会尝试使用product

    作为旁注,我建议避免使用裸露的except,因为这会掩盖代码执行期间发生的任何问题/中断(请参阅this question)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2020-01-16
      • 2019-12-05
      • 2017-09-19
      • 2020-09-26
      • 2022-01-02
      • 2019-03-22
      相关资源
      最近更新 更多