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.

В любом случае, как вы обнаружили, вы можете просто реализовать собственную сериализацию, которая не требует дублирования параметров запроса.

Другие вопросы по тегам