Доступ к спискам в запросе Django.Публикация

#json #httprequest #python-3.7 #django-2.1

#json #httprequest #python-3.7 #django-2.1

Вопрос:

У меня возникли трудности с доступом ко всем данным, возвращаемым моими формами в моей post функции. Я замечаю значительное несоответствие между тем, что отображается при печати request.POST , и тем, когда мой код обращается к этим данным. Надеюсь, кто-нибудь сможет мне это объяснить.

Вывод print(request.POST) :

 print(request.POST)
<QueryDict: {'csrfmiddlewaretoken': ['AXMPO...'],
 'start_date': ['2019-03-01'], 'end_date': ['2019-03-26'], 
'reports': ['4', '1']}>
  

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

 json.dumps(request.POST)
'{"csrfmiddlewaretoken": "AXMPO...",
 "start_date": "2019-03-01", "end_date": "2019-03-26",
 "reports": "1"}'
  

Все это выглядит довольно похоже, пока вы не увидите "reports" значение. Пользователь выбирает эти отчеты с помощью виджета множественного выбора в моей форме, и мой код повторяет предоставленные идентификационные номера. Однако, независимо от того, сколько отчетов я выбираю, я получаю только один идентификатор. Если кто-нибудь может объяснить, почему это происходит, я был бы искренне признателен.

Ответ №1:

Оказывается, это действительно проблема старой школы. Я мог бы пожелать, чтобы это было более заметно в документации, хотя. Объяснение Саймона Уилсона приведено ниже:

«»»

Это особенность, а не ошибка. Если вам нужен список значений для ключа, используйте следующее:

values = request.POST.getlist('key')

Причиной этого является то, что метод API должен последовательно возвращать либо строку, либо список, но никогда оба. Обычным случаем в веб-приложениях является то, что ключ формы должен быть связан с одним значением, так что это то, что делает синтаксис []. getlist() существует для случаев (подобных вашему), когда вы собираетесь использовать ключ несколько раз для одного значения. «»» — Саймон Уилсон, 13 лет назад.