django формы: не удалось получить вручную (HTML) поля вложенных объектов
Я пытаюсь реализовать админ django, как встроенное добавление связанных объектов в моем приложении. Абсолютно новичок в django, но у меня есть опыт работы с ROR и Laravel, и я хорошо разбираюсь в ajax, поэтому я не хочу вдаваться в подробности formsets
из django и хочу добавить связанные объекты формы, используя ajax, как я обычно делал бы в любом другом месте. Просто будьте осторожны с именами полей ввода, чтобы вы могли получить их на стороне контроллера в массиве.
В form.html я просто добавляю что-то вроде этого;
<label class="control-label">Name</label>
<input name="items[1][name]" class="form-control"/>
<label class="control-label">Attr</label>
<input name="items[1][attr]" class="form-control"/>
Это всего лишь пример, чтобы дать вам представление о том, как генерируется мой HTML. У меня есть несколько предметов в моей форме.
Традиционно на стороне сервера я бы получил объект формы (запрос ввода), подобный этому; по крайней мере в Ларавеле
[form=> [
"some_attr"=>"val",
"items"=> [
"1"=> [
"name"=>"some name",
"attr"=> "some val"
]
]
] ]
Суть в том, что я бы получил и массив items
в моем запросе на стороне контроллера и может перебрать его.
ПРОБЛЕМА Я делаю все так же, как описано выше, но когда я пытаюсь получить доступ к данным со стороны контроллера. Он не конвертирует поля элементов в массив объектов. Когда я печатаю form.data
Я получаю что-то вроде этого,
<QueryDict: {'csrfmiddlewaretoken': ['C5i6Ge7aQMvoMlHODjwgMziXE7RcIs5F99ibo7YsSZnZKF9z2TdMlwhep8OB668M'], 'some_parent_attr': ['value'], 'status': ['1'], 'items[5][name]': ['some name'], 'items[5][attr]': ['some val'] ....
Django не конвертирует элементы в массив, он просто делает его строковым ключом 'items[5][name]'
который не может быть повторен. Поскольку у меня было бы несколько объектов со случайными идентификаторами, невозможно получить все элементы из этого словаря, используя там ключи.
Есть ли способ, которым я не знаю, как заставить это работать? Как-то можно отформатировать так, как я ожидаю? Или это не может быть сделано таким образом?
Я был бы очень признателен за любые рекомендации / помощь по этой проблеме.
1 ответ
Python возвращает запрос, который определенным образом похож на словарь, если вы хотите преобразовать его в словарь, просто добавьте это:
myDict = dict(form.data.iterlists())
тогда вы можете получить доступ к своим элементам с помощью ключа, например:
>>> myDict['items[5][name]'] # Will return
['some name']