Ajax отправка пустого списка через POST-запрос Django

#python-3.x #django #ajax #request

#python-3.x #django #ajax #запрос

Вопрос:

Я отправляю массив пользовательских ответов в свое тестовое приложение и получаю два массива (один из них заполнен правильно, а другой пуст). Также в консоли я заметил, что я получаю запросы (POST и GET). Как я должен отправить массив через ajax POST, чтобы он был отправлен только один раз?

Sripts.js:

 function sendAnswers() {
    $.ajax({
        type: "POST",
        url: 'result',
        data: {
            res_list: resultList()
        },
        success: function () {
        }
    })
    location.href = 'result'
}

function resultList() {
    let allAnswersList = [];
    allAnswersList = getCheckedCheckBoxes().concat(getSequence())
    return allAnswersList
}
  

Views.py:

 def result(request):
    user_answers_list = request.POST.getlist('res_list[]')
    context = {'res_lst': user_answers_list }
    return render(request, 'main/result.html', context)
  

urls.py:

 from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.index, name='home'),
    path('registration/', include('django.contrib.auth.urls')),
    path('registration', views.registration, name='registration'),
    path('test', views.test, name='test'),
    path('result', views.result, name='result')
]
  

result.html:

  <div class="alert alert-warning mt-2" id="mainArea">
    {% for question in testing %}
        <div class="alert alert-secondary mt-2" id="questionArea{{ forloop.counter0 }}">
            <form method="post" id='testForm' data-url="{% url 'test' %}">
                {% csrf_token %}
                <table>
                    <thead>
                    <tr>
                        <th>{{ forloop.counter }}. {{ question.1 }}</th>
                    </tr>
                    </thead>
                </table>
                {% if question.4 %}
                    {% for images in img %}
                        {% if images.picture == question.4 %}
                            <img src="{{ images.picture.url }}" class="mainImg" alt=""><br>
                        {% endif %}
                    {% endfor %}
                {% endif %}
                {% if question.0 == '1' %}
                    {% for el in question.2 %}
                        <label>
                            <input type="checkbox" class="checkbox" onclick="getCheckedCheckBoxes()"
                                   name="{{ question.1 }}"
                                   value="{{ el }}" id="{{ question.1 }}"/> {{ el }}
                        </label><br>
                    {% endfor %}
                {% else %}
                    <label>
                        {% for num in question.2 %}
                            <h6>{{ forloop.counter }}. </h6>
                            <select id="myselect" class="myselect" name="myselect" onchange="getSequence()">
                                <option disabled selected></option>
                                {% for el in question.2 %}
                                    <option value="{{ el }}" id="{{ question.1 }}{{ forloop.counter0 }}"
                                            label="{{ el }}">
                                    </option>
                                {% endfor %}
                            </select><br>
                        {% endfor %}
                    </label>
                {% endif %}
            </form>
        </div>
    {% endfor %}
    <button type="button" value="snd" id="sendAnsButton" onclick="sendAnswers()" class="button">Завершить тест</button>
</div>
  

Консоль:

 [18/Sep/2020 16:36:33] "POST /result HTTP/1.1" 200 33229
[18/Sep/2020 16:36:33] "GET /result HTTP/1.1" 200 33229
  

Ответ №1:

Вы можете настроить свое result представление так, чтобы оно принимало только POST-запросы.

Вы можете использовать либо @require_GET

 @require_GET
def result(request):
    ...
  

или просто добавьте if оператор в свой result :

 def result(request):
    if request.method == 'POST':
        # your code
  

также вы можете возвращать ошибку для неверных запросов:

 def result(request):
    if request.method != "GET":
        return HttpResponseBadRequest("Expecting GET request")