Имя '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

что нужно сделать, чтобы избавиться от этой ошибки?

  1. Вам не нужны global здесь (почему вы так думаете?)
  2. Ваша проблема связана с тем, что c не обязательно всегда имеет значение из-за того, как вложены ваши if. (c не получает никакого значения, если метод запроса не POST, а вы все равно пытаетесь использовать его в контексте шаблона.)
  3. Вам никогда не понадобится использовать 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 вашего кода.

Вернуться на верх