Django: get HTML form value in view.py failed with empty <QueryDict: {}> and None value

Я новичок в django и следую учебнику djangogirls. С небольшими изменениями я пытаюсь получить значение из текстового поля формы и вывести его в view.py, а затем снова отобразить это значение в другом поле "result" на html странице.

html:

<!DOCTYPE html>
<html>
  <body>
    <form>
        <div>
            <label>num_1:</label>
            <input type = "text" name="num_1" value = "1" placeholder="Enter value">
        </div>
        <div>
           <label>num_2:</label>
            <input type = "text" name="num_2" value = "2" placeholder="Enter value">
        </div>
    </form>

        <div>
            <label>result:</label>
            {{ result }}
        </div>
    <br>
    </body>
</html>

view.py:

def post_list(request):
    # posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    num1 = request.POST.get('num_1')
    num2 = request.POST.get('num_2')
    result = int(num1)+int(num2)
    print(request.POST)
    print("num1 ", num1)
    # return render(request, 'blog/post_list.html', {'posts': posts})
    return render(request, 'blog/post_list.html', {'result': result})

когда я активирую локальный сервер, я получаю:

Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
<QueryDict: {}>
num1  None

Вам нужно добавить method="post" и {% csrf_token %} для вашей формы. Например:

<form method="POST">
    {% csrf_token %}
    <div>
      <label>num_1:</label>
      <input type="text" name="num_1" value="1" placeholder="Enter value" />
    </div>
    <div>
      <label>num_2:</label>
      <input type="text" name="num_2" value="2" placeholder="Enter value" />
    </div>
    <br />
    <div>{{ result }}</div>
    <button type="submit">Submit</button>
</form>

В вашем views.py:

def post_list(request):
    result = 0
    if request.method == "POST":
        num1 = request.POST.get('num_1')
        num2 = request.POST.get('num_2')
        result = int(num1) + int(num2)
        print(request.POST)
        print(result)

    context = {
        'result': result
    }
    return render(request, 'blog/post_list.html', context)
  

Вот frontend:

enter image description here

И терминал:

enter image description here

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