[Преамбула: хотя я понимаю, что могут быть более простые способы сделать это (например, просто использовать встроенный администратор Django или использовать встроенные функции для всего редактирования на одной странице и т. Д.), К сожалению, яне контролирует дизайн, поэтому я ищу помощь в том, как работать с тем, что мне поручено реализовать.]
У меня есть 2 модели, Deck и Slide.Слайд имеет внешний ключ к палубе.(Существует также промежуточная модель - это отношение m2m - но чтобы упростить и без того сложное обсуждение, я собираюсь сделать вид, что это более простое отношение многие-к-одному.)
Интерфейс, которым я являюсьПри реализации отображается страница с формой для ввода или редактирования полей Deck, которая также включает в себя встроенный список слайдов в колоде, с некоторыми полями (которые я нахожусь в процессе ввода текста), а также с «edit» и«удалить» якорную ссылку для каждого слайда.(см. img) Если вы нажмете ссылку «изменить», вы перейдете на новую страницу с подробной формой для ввода всей информации, представляющей контент для соответствующего слайда.Если вы нажмете «Отправить» в этой форме, вы вернетесь на страницу для колоды.
Поскольку предлагается заглавный вопрос, я, очевидно, не хочу фиксировать какую-либо колоду или слайды в БД, пока пользователь не нажмет кнопку Отправить для всей колоды, т.е. они могут добавитьили отредактируйте много слайдов тем временем и можете решить отменить весь процесс.
Каков наилучший, самый чистый способ сделать это?
Я смотрел на класс FormWizard Джанго (http://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/), но, похоже, ориентирован на многошаговую работулинейный поток, а не моя ситуация.
Мне уже пришлось реализовать это для демонстрации, и я прошел большую часть пути, создав встроенный FormSet для слайдов и форму для колоды, а затем написал подклассы для моих форм, которые скрываютформа и набор форм, когда я прохожу между двумя страницами.Вот некоторый код, демонстрирующий, как я использую скрытую форму для колоды на странице слайда:
class DeckForm(ModelForm):
class Meta:
#stuff here
class HiddenDeckForm(DeckForm):
def __init__(self, *args, **kwargs):
super(DeckHiddenForm, self).__init__(*args, **kwargs)
for name, field in self.fields.iteritems():
field.widget = field.hidden_widget()
field.required = False
Так что в моих представлениях каждый раз, когда я перехожу на страницу формы слайда, я генерирую HiddenDeckForm из данных POSTи передать его, а затем, на мой взгляд, возвращаясь к странице колоды, я воссоздаю DeckForm (не скрытый подкласс) из данных POST.Я не собираюсь публиковать весь свой код формы Slide, поскольку я в основном спрашиваю, есть ли лучший способ сделать это, но аналогичным образом у меня есть класс HiddenSlideForm, и я передаю набор форм из них между моими шаблонами, чтобы сохранить состояние.
Затем, когда пользователь нажимает «Отправить» на странице «Палуба», форма «Палуба» и набор форм «Слайды» сохраняются в БД.
Это работает, но это хороший способ сделать это?Это был хороший кусок кода, и мне действительно пришлось покопаться в некоторых внутренних элементах Django - мне кажется, что я использую вещи так, как они не были предназначены для использования.Или уже есть более стандартный способ обработки этого сценария?
Я выложу больше кода, если это будет полезно.
Спасибо за помощь!
PS Как вы видите, я реализую его в jquery colorbox и использую ajax для переходов между формами, но я просто использую обычный рендеринг шаблонов / форм в моих представлениях и передаювернул html обратно на страницу с помощью вызова ajax.,,Полагаю, я мог бы что-то сделать с json, но настоятельно предпочел бы придерживаться передачи отрендеренного шаблона, так как такая реализация может быть использована без ajax или javascript, если это необходимо.