Django AJAX Request Only Получение последнего элемента (не проблема getlist)
Я пытаюсь создать систему тегов в Django. По сути, я передаю список тегов (флажки в форме) через AJAX в представление Django, которое обновит список тегов новым выбором соответствующих тегов в httpresponse.
Проблема в том, что Django, кажется, получает последний элемент списка самостоятельно, даже после getlist. Фактически, если я печатаю весь запрос.GET, он показывает только один элемент в каждом списке.
Код javascript/jQuery находится здесь:
$(document).on('change', '.form-check-input',function () {
var all_tags = $("input:checkbox").map(function() { return this.id; }).get();
var selected_tags = $("input:checkbox:checked").map(function() { return this.id; }).get();
alert(all_tags);
alert(selected_tags);
$.ajax({
url: "{% url 'AJAX_tagFilter' %}",
data: { 'all_tags': all_tags, 'selected_tags': selected_tags },
cache: false,
type: 'GET',
success: function (data) {
alert(selected_tags);
$('#test').html(data);
console.log('success');
}
});
});
И я сделал пару предупреждений, чтобы увидеть, что передается правильно на каждом этапе. Я вижу все теги, которые я ожидаю.
12,13,21,16,17,15,11,7,18
12,13
Но когда дело доходит до представления Джанго:
def getTagFilterSidebar(request):
if 'selected_tags[]' in request.GET:
all_tags = request.GET.getlist("all_tags[]")
selected_tags = request.GET.getlist("selected_tags[]")
debug_text4 = str(request.GET)
Я не вижу список тегов. Это вывод:
<QueryDict: {'_': ['1539460657253'], 'all_tags[]': ['18'], 'selected_tags[]': ['13']}>
Важнейшей частью этого является то, что он работает нормально на моем локальном сервере. Однако я использую Zappa и загрузил его на AWS. Это только на AWS, что это не работает правильно. Так что я немного озадачен тем, что происходит. Буду очень признателен за помощь, спасибо!
2 ответа
По предложению Даниэля Розмана:
Вместо того, чтобы передавать список, я использовал функцию соединения двух переменных в строке, обозначенной запятой:
var all_tags = $("input:checkbox").map(function() { return this.id; }).get();
var selected_tags = $("input:checkbox:checked").map(function() { return this.id; }).get();
Оттуда я использовал функцию разделения в Django, чтобы полностью изменить процесс:
all_tags = request.GET.getlist("all_tags")[0].split(",")
Не самый прямой способ решения проблемы, но быстрый и легкий.
Проблема в том, что jQuery сериализует массив с использованием дублирующих параметров запроса, чего не поддерживает Amazon API Gateway (используемый Zappa).
Или нет, я должен сказать. Всего несколько дней назад Amazon объявил, что API Gateway теперь будет поддерживать это:
Начиная с сегодняшнего дня, Amazon API Gateway поддерживает несколько заголовков и параметров строки запроса с одним и тем же именем в запросе API.
В любом случае, как вы обнаружили, вы можете просто реализовать собственную сериализацию, которая не требует дублирования параметров запроса.