#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")