Django, jquery $ .post: к элементам запроса добавлен дополнительный "[]"

Повторяющийся ответ объясняет, как решить эту проблему с помощью $ .ajax. Я использую $ .post, хотя не понимаю, как устанавливать индивидуальные настройки для вариантов использования $ .post, которые я использовал более 20 раз на протяжении всего проекта. Тем не менее, документация намекает, что это возможно, и один комментарий к этой теме утверждает, что это так.

Я пытаюсь отправить запрос на публикацию в моем представлении Django, используя jQuery $ .post.

Элементы, которые я пытаюсь получить в Python, - это списки (массивы), которые я создаю из нескольких идентификаторов.

Вот мой код jQuery:

var newBaseline = function () {

    // Initialize arrays each time the function is run
    var timeArray = [];
    var parametersArray = [];
    var runsArray = [];

    // Cycle through some input elements and get their values, push to array
    timeRangeInputs.each(function() {
        timeArray.push($(this).val());
    });

    // Cycle through some checkboxes and get their data-id values, push to array
    parameterContainer.find("input:checked").each(function() {
        parametersArray.push($(this).data("parameter_id"));
    });

    // Cycle through some checkboxes and get their data-id values, push to array
    runContainer.find("input:checked").each(function() {
        runsArray.push($(this).data("run_id"));
    });

    // Just a flag for my view so I can do if-else cases in python
    // as the view handles several forms in the same page
    var flag = "new-baseline";

    $.post("{% url 'my_view %}", {
        csrfmiddlewaretoken: "{{csrf_token}}",
        timeArray: timeArray,
        parametersArray: parametersArray,
        runsArray: runsArray,
        flag: flag
    }, function(data) {
        // check valid or errors, etc
    }).done();
};

Проблема возникает, когда я перехожу в представление Python. Объект request.POST QueryDict подходит, но к массивам добавлены дополнительные [].

print(request.POST)
>>> <QueryDict: {'runsArray[]': ['3, 7'],
                 'csrfmiddlewaretoken': ['foobar'],
                 'parametersArray[]': ['409'],
                 'timeArray': ['257.5674', '591.8532'],
                 'flag': ['new-baseline']
                }>
  1. Почему это происходит?
  2. Почему «флаг» ведет себя иначе? (Я просто помечаю жесткий код как "строку" в моем JS)
  3. Почему жестко заданное строковое значение 'flag' превращено в список строк? ['new-baseline']

Кажется странным, что для получения значений списка в python я должен добавить дополнительный [] к моим ключам, который никогда не был включен в мой JS:

print(request.POST.getlist('runsArray[]')
>>> ['3, 7']

скорее, чем:

print(request.POST.getlist('runsArray')
>>> None

Это может происходить из-за непонимания того, как выполняется jQuery $ .post, что происходит внутри и / или как Django (или даже Python) обрабатывает метод запроса, но вместо простого добавления дополнительного символа «[]» я бы хотелось бы понять, почему это происходит, нормально ли это или я что-то делаю не так.

[РЕДАКТИРОВАТЬ]

Попытка заставить настройки работать с $ .post вместо того, чтобы переходить на $ .ajax.

Насколько я понял из документации, добавление настроек в $ .post возможно, но это не пример. Это справедливо для $ .ajax, но неясно, должен ли я изменить $ .post на $ .ajax, если я хочу использовать настройки.

Пытался:

$.post(
    "{% url 'my_django_url' %}",
    {
        csrfmiddlewaretoken: "{{csrf_token}}",
        timeArray: timeArray,
        parametersArray: parametersArray,
        runsArray: runsArray,
        flag: flag
    },
    traditional: true
)

Или же:

$.post(
    "{% url 'my_django_url' %}",
    {
        csrfmiddlewaretoken: "{{csrf_token}}",
        timeArray: timeArray,
        parametersArray: parametersArray,
        runsArray: runsArray,
        flag: flag,
        traditional: true
    })

Или же:

$.post(
    "{% url 'my_django_url' %}",
    {
        csrfmiddlewaretoken: "{{csrf_token}}",
        timeArray: timeArray,
        parametersArray: parametersArray,
        runsArray: runsArray,
        flag: flag
    },
    settings={traditional: true})

Или же:

$.post(
    "{% url 'my_django_url' %}",
    {
        csrfmiddlewaretoken: "{{csrf_token}}",
        timeArray: timeArray,
        parametersArray: parametersArray,
        runsArray: runsArray,
        flag: flag
    },
    {traditional: true})

Ни то, ни другое не работает, но в документации указано, что настройки представляют собой набор пар ключ: значение. На самом деле он не указывает и не показывает, как и где их использовать.

Связанный «дубликат» объясняет, как решить для $ .ajax, но вопрос задавался не об этом.

Лишние скобки исчезнут, если я просто добавлю

$.ajaxSetup({
    traditional: true
});

Но это установило бы это значение по умолчанию для всех вызовов ajax. Я не уверен, хорошая ли это идея или это отрицательно повлияет на будущее использование метода (или даже на одно из других 20+ применений в рамках проекта).

[РЕШЕНИЕ]

На всякий случай, если кто-то еще столкнется с этим в будущем:

Проблема заключалась в том, что не объявлялись пары ключ: значение для всех аргументов в вызове метода. Сейчас это имеет смысл, но раньше я этого не видел. Вместо того, чтобы просто передавать параметры по умолчанию, вы должны указать, какой из них является URL-адресом, данными, успехом (необязательно) и настройками (как прямые пары ключ: значение, без объявления словаря или списка «настроек»).

IE:

$.post({
    url: "{% url 'my_django_url' %}",
    data: {
        csrfmiddlewaretoken: "{{csrf_token}}",
        timeArray: timeArray,
        parametersArray: parametersArray,
        runsArray: runsArray,
        flag: flag
    },
    success: function(data) {
        console.log("Success! ");
        console.log(data);
    },
    traditional: true
}).done();

В Django вы можете использовать get() или getList в зависимости от того, нужен ли вам отдельный элемент или список элементов. Django не делает ничего особенного с [] в именах клавиш, вы можете отключить эту функцию jQuery, используя традиционные настройки.

Alasdair 11.04.2018 13:07

Значит, в примерах использования Django в основном безопасно устанавливать традиционное значение true? Можно ли использовать настройки в функциях $ .post? У меня их много, и если я смогу не менять их все на $ .ajax, я бы предпочел, чтобы

Mormoran 11.04.2018 13:12

Да, вы сможете использовать его с $.post.

Alasdair 11.04.2018 14:00

Знаете ли вы, где в моем $ .post я объявляю настройки? Кажется, я не могу заставить его работать.

Mormoran 11.04.2018 14:24

Похоже, вам нужно использовать вторая форма, например $.post({url: url, data: {...}, traditional: true}). Если вы выполняете только ajax-запросы к Django API, то использование $.ajaxSetup кажется хорошим вариантом.

Alasdair 11.04.2018 14:52

Великолепно, это была ошибка. Если вы опубликуете это как ответ, я приму его.

Mormoran 11.04.2018 15:09

В вашем вопросе все еще есть много вещей, которые покрываются повторяющимся вопросом. Если вы упростите его до «как мне использовать traditional: true с $.post, я снова открою его и добавлю ответ.

Alasdair 11.04.2018 15:17

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

Munim Munna 11.04.2018 22:58
0
8
175
0

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