Как передать контекстную переменную из переменной внутри оператора 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}