Несколько форм django, опубликованных на одной странице, встроенные строки и добавление/удаление этих встроенных строк.

StackOverflow https://stackoverflow.com/questions/1404973

  •  05-07-2019
  •  | 
  •  

Вопрос

Есть несколько вопросов о более или менее одной и той же проблеме в stackoverflow, но ни один из них, похоже, не охватывает проблемы, которые я могу предвидеть.Поскольку мои знания Django ограничены, возможно, я преувеличиваю...так..

С помощью django я хочу отредактировать две модели: List и ListItem в одном представлении.List как обычная форма и listitem как встроенный набор форм.Создание этих двух форм не является проблемой.Передача их в шаблон представления > также не является проблемой.

Меня беспокоит то,

1) Как опубликовать их на один и тот же адрес и обработать этот запрос на публикацию.

2) Как настроить добавление/удаление этих встроенных ListItems из этого набора форм с помощью javascript.

2.1), если я отправлю ajax-запрос на какой-то адрес, чтобы удалить объект ListItem, а затем использую javascript для удаления этой части формы.Как часть представления django узнает, какой объект удалить из базы данных?Нужно ли мне передавать идентификатор объекта в шаблон, чтобы я мог отправить его обратно для просмотра с помощью ajax?

2.2) Если весь измененный встроенный набор форм ListItem будет опубликован после того, как я удалил/добавил строки, не вызовет ли это проблем, потому что словарь объектов, который использовался изначально, был изменен между ними?

3) какие-нибудь еще подводные камни кто-нибудь мог увидеть?

Кстати, мне не нужны примеры кода.Если можете, просто объясните, как все работает и что мне следует делать и иметь в виду.Если вы знаете современные примеры, я мог бы также использовать некоторые ссылки.

Изменить (и ответить на мои собственные вопросы):Я попробовал и вот что нашел:1) Просто поставь их...в виду вы можете сделать это следующим образом:

form = ListForm(request.POST, instance=l)
formset = ShoppingListFormSet(request.POST, instance=l)

А дальше делайте все, что нужно – очень просто и легко.

2) Дублируйте существующую строку/форму или удалите ее.Все, что вам нужно иметь в виду, это то, что имена элементов правильные, а материал, который загружается набором форм с помощью {{ form.management_form }}, содержит актуальную и правильную информацию о количестве имеющихся форм.Все имена полей также должны быть актуальными.Если удалить форму между формами 1 и 3, то номера формы 3 нужно поменять на 2 и так далее.

2.1) идентификатор элемента можно извлечь из {{ form.initial.id }} и затем использовать в форме

2.2) Нет, если информация form.management_form верна и имена полей актуальны (см. 2.)

3) Просто нужно создать представления, чтобы ваш сайт не был испорчен подделкой межсайтовых запросов (см. http://docs.djangoproject.com/en/dev/ref/contrib/csrf/)

Алан.

Это было полезно?

Решение

То, как вы это описываете, нормально.На самом деле я только что опубликовал аналогичный ответ на другой вопрос о Django, который вы можете увидеть здесь: Форма добавления/удаления Django без многократной отправки Разница, конечно, в том, что нет JavaScript для выполнения модных модификаций AJAX и HTML на стороне клиента.

Основная суть REST, как упоминалось выше (я знаю, слишком упрощенно), заключается в том, что все доступно по URL-адресу.Способ «Django знает, какую запись следует удалить» заключается в том, что для каждого URL-адреса ему сопоставлено определенное представление.Это представление, которое получает идентификатор записи, а затем знает, какую из них следует удалить.

Если вы еще не начали экспериментировать с AJAX, я бы рекомендовал изучить JQuery поскольку это обеспечивает некоторые очень простые в использовании оболочки вокруг объектов XML-запросов, встроенных в браузеры.

Кстати, это всего лишь рекомендация, поскольку похоже, что вы новичок в этом: сначала заставьте все работать БЕЗ ajax (даже если выполнение действий приводит к белому экрану или плохому интерфейсу), а затем добавьте ajax.Его легко отладить, когда вы не возитесь с AJAX, а затем добавить AJAX, когда убедитесь, что все это работает на стороне сервера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top