Как передать контекстную переменную из переменной внутри оператора if?

Внутри оператора if у меня есть check_order, который мне нужно иметь в качестве контекстной переменной для моего шаблона, я получаю это traceback: local variable 'check_order' referenced before assignment. Как мне получить ее в качестве контекстной переменной, не повторяя код, чтобы получить ее вне оператора if?

View

if request.method == "POST":
    if request.user.is_authenticated:
        customer = request.user.customer
        check_order = OrderItem.objects.filter(order__customer=customer)
        if check_order:
            if form.is_valid():
                #does logic
        else:
            messages.error(request, f"Failed")
    else:
        return redirect()

context = {"check_order": check_order}

Это происходит из-за скопирования переменных. Переменная check_order объявлена в ветви оператора if, но на нее ссылаются вне этой ветви - она не находится в области видимости, поэтому Python выдает ошибку, сообщая вам, что вы используете ее до того, как она определена.

Подробнее о сфере применения Python можно прочитать здесь: https://realpython.com/python-scope-legb-rule/.

Следующий код решит вашу проблему:

# Declare check_order with no value but in the same scope it is referenced
check_order = None

if request.method == "POST":
    if request.user.is_authenticated:
        customer = request.user.customer
        check_order = OrderItem.objects.filter(order__customer=customer)
        if check_order:
            if form.is_valid():
                #does logic
        else:
            messages.error(request, f"Failed")
    else:
        return redirect()

context = {"check_order": check_order}

Как сказал @liam, проверка qs помогла! Спасибо!

if request.method == "POST":
    if request.user.is_authenticated:
        customer = request.user.customer
        check_order = OrderItem.objects.filter(order__customer=customer)
        if check_order:
            if form.is_valid():
                #does logic
        else:
            messages.error(request, f"Failed")
    else:
        return redirect()

check_order = []
context = {"check_order": check_order}
Вернуться на верх