Почему request.POST всегда содержит название кнопки? Как избежать этого?

Вот мой HTML-код:

<!DOCTYPE html> <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        {% load static %}
        <script src="{% static 'jquery-3.6.2.min.js' %}" ></script>
        <script src="{% static 'jquery.js' %}" ></script>
    </head>



    <body>
        <form action="{% url 'index' %}" method="post">
            {% csrf_token %}
            <button name="button1">button1</button>
            <button name="button2">button2</button>
            <input type="text" name="textbox">
        </form>
    </body>

</html>

Каждый раз, когда я набираю текст в текстовом поле, допустим, я набираю: "привет" и нажимаю Enter, request.POST возвращает:

<QueryDict: {'csrfmiddlewaretoken': ['FX1qFNzbQUX3fYzAwW27cOu83omLzifnlLU5X0WXXVdOiyNretM5b3VgsGy1OogA'], 'button1': [''], 'textbox': ['hi']}>

Почему request.POST содержит 'button1': [''], хотя я не нажимал на него?

Есть ли способ избежать того, чтобы request.POST имел 'button1': ['']?

Вы можете попробовать

<!--base.html--> 
{% load static %}

<!DOCTYPE html> <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="{% static 'jquery-3.6.2.min.js' %}" ></script>
        <script src="{% static 'jquery.js' %}" ></script>
    </head>



    <body>
{% block content %}
        <form action="{% url 'index' %}" method="post">
            {% csrf_token %}
           <input type="text" name="textbox">
            <button name="button1">button1</button>
            <button name="button2">button2</button>
 
        </form>

{% endblock %}
    </body>

</html>

Вам необходимо использовать атрибут "action" внутри тега <button>.

Хороший подход к определению того, какая кнопка была нажата, заключается в следующем:

В файле шаблона:

<form action="{% url 'index' %}" method="post">
  {% csrf_token %}
  <button name="action" value="button1_pressed">button1</button>
  <button name="action" value="button2_pressed">button2</button>
</form>

В вашем views.py:

if request.method == "POST":
    back = reverse('index')
    action = request.POST.get("action")

    if action == "button1_pressed":
        # do something
        messages.success(request, "Successed!")
        return redirect(back)

    if action == "button2_pressed":
        # do something else
        messages.success(request, "Successed!")
        return redirect(back)
Вернуться на верх