UnboundLocalError в / cart / slug / локальная переменная 'product', на которую ссылается до назначения - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь использовать ссылку для добавления товаров в корзину, но мне постоянно говорят, что я ссылаюсь на переменную до того, как она назначена.

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 %}

У меня она работала секунду, но я создал новая таблица в базе данных, изменила имя, где это применимо, и теперь она не работает.

1 Ответ

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

В update_cart, если исключение возникает во время product = Product2.objects.get(slug = slug), то product не будет определено, а строка if 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"))

Предложение else для try/except здесь будет выполнено только в том случае, если код внутри кода не сгенерировал никаких исключений try, что означает, что вы не будете пытаться использовать product, если он не был успешно определен.

В качестве примечания, я рекомендую избегать использования except, поскольку это может замаскировать любые проблемы / прерывания, возникающие во время выполнения вашего кода (см. этот вопрос ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...