Имя 'c' не определено в python
Я пытался сделать калькулятор с помощью Django, но получил эту ошибку
Эта функция представления принимает входные данные с html-страницы и выполняет расчет.
Где здесь проблема?
views.py
from django.shortcuts import render
from django.template import loader
from django.http import HttpResponse
# Create your views here.
def indx(request):
template = loader.get_template('calculator/calc_home.html')
if request.method=='POST':
global c, a, b
a = request.POST.get('num1')
b = request.POST.get('num2')
option = request.POST.get('select_val')
if a == "" or b == "" :
c = 'please select 2 numbers'
else:
if option == 'add':
c = int(a) + int(b)
elif option == 'multiply':
c = int(a) * int(b)
elif option == 'substract':
c = int(a) - int(b)
elif option == 'devide':
if int(b) + 0 == 0:
c = 'infinity'
else:
c = int(a) / int(b)
else:
c = 'please choose an option'
context = {
'sum': c,
}
return HttpResponse(template.render(context, request))
calc_home.html
tml код принимает входные данные и передает их в представление
<h1>welcome to calculator</h1>
<p>enter 2 numbers</p>
<form method="POST">
{% csrf_token %}
<label for="num_1">enter 1st number:</label>
<input type="number" name="num1" value='num_1'><br>
<label for="num_2">enter 2nd number:</label>
<input type="number" name="num2" value='num_2' ><br>
<input type="radio" value="add" name="select_val" id="add" >
<label for ="add">+</label><br>
<input type="radio" value="substract" name="select_val" id="subs" >
<label for ="subs">-</label><br>
<input type="radio" value="multiply" name="select_val" id="multiply" >
<label for ="multiply">*</label><br>
<input type="radio" value="devide" name="select_val" id="devide" >
<label for ="devide">/</label><br>
<input type="submit" name="submit" value="submit">
</form>
<h1>{{ sum }}</h1>
<br><a href="{% url 'home:homex' %}">go to home</a>
Ошибка
Эта ошибка возникает на html-странице
name 'c' is not defined
Request Method: GET
Request URL: http://127.0.0.1:8000/calculator/
Django Version: 4.0.5
Exception Type: NameError
Exception Value:
name 'c' is not defined
что нужно сделать, чтобы избавиться от этой ошибки?
- Вам не нужны
global
здесь (почему вы так думаете?) - Ваша проблема связана с тем, что
c
не обязательно всегда имеет значение из-за того, как вложены ваши if. (c
не получает никакого значения, если метод запроса не POST, а вы все равно пытаетесь использовать его в контексте шаблона.) - Вам никогда не понадобится использовать
loader.get_template()
в обычном использовании.
У вас будет больше шансов, если вы рефакторите свой код, чтобы использовать простую старую функцию для вычисления, и вызовете ее в представлении:
from django.shortcuts import render
def do_calculation(a, b, option):
if not (a and b):
return 'please select 2 numbers'
if option == 'add':
return int(a) + int(b)
if option == 'multiply':
return int(a) * int(b)
if option == 'substract':
return int(a) - int(b)
if option == 'devide':
if int(b) + 0 == 0:
return 'infinity'
return int(a) / int(b)
return 'please choose an option'
def indx(request):
result = None
if request.method == 'POST':
a = request.POST.get('num1')
b = request.POST.get('num2')
option = request.POST.get('select_val')
result = do_calculation(a, b, option)
return render(request, 'calculator/calc_home.html', {
'sum': result,
})
Помимо этих улучшений, вам стоит обратить внимание на формы Django для дальнейшего DRY вашего кода.