Джанго: Как перенести данные формы модели с одной страницы на другую и обратно, не передавая в БД? - PullRequest
4 голосов
/ 19 мая 2011

[Преамбула: хотя я понимаю, что могут быть более простые способы сделать это (например, просто использовать встроенный администратор Django или использовать встроенные функции для всего редактирования на одной странице и т. Д.), К сожалению, яне контролирует дизайн, поэтому я ищу помощь в том, как работать с тем, что мне поручено реализовать.]

У меня есть 2 модели, Deck и Slide.Слайд имеет внешний ключ к палубе.(Существует также промежуточная модель - это отношение m2m - но чтобы упростить и без того сложное обсуждение, я собираюсь сделать вид, что это более простое отношение многие-к-одному.)

Интерфейс, которым я являюсьПри реализации отображается страница с формой для ввода или редактирования полей Deck, которая также включает в себя встроенный список слайдов в колоде, с некоторыми полями (которые я нахожусь в процессе ввода текста), а также с «edit» и«удалить» якорную ссылку для каждого слайда.(см. img) Если вы нажмете ссылку «изменить», вы перейдете на новую страницу с подробной формой для ввода всей информации, представляющей контент для соответствующего слайда.Если вы нажмете «Отправить» в этой форме, вы вернетесь на страницу для колоды.

Screen shot

Поскольку предлагается заглавный вопрос, я, очевидно, не хочу фиксировать какую-либо колоду или слайды в БД, пока пользователь не нажмет кнопку Отправить для всей колоды, т.е. они могут добавитьили отредактируйте много слайдов тем временем и можете решить отменить весь процесс.

Каков наилучший, самый чистый способ сделать это?

Я смотрел на класс 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, если это необходимо.

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Идея A: Храните незафиксированные данные в сеансе, пока все не будет готово для фиксации. Каждая форма / поездка к клиенту просто добавляет / обновляет накопленные данные. Если они откажутся от этого, у вас останется только дерьмо, пока сеанс не будет уничтожен. Вы можете сохранить практически все что угодно для сессии.

Идея B: добавить логическое значение в таблицу базы данных, которое указывает, когда строка была зафиксирована (например, «is_active» или «is_pending»). Означает, что вы никогда ничего не теряете, но немного больше неудобства в управлении.

0 голосов
/ 19 мая 2011

Выполнив очень похожее требование, работая с инструментами набора форм, я полностью согласен с тем, что делать обручи и попытки понять / настроить набор форм совершенно не стоит.

Для скриншота, подобного вашему, я 'Использовать только одну форму со всеми слайдами на колоду.- Форма, а не форма.

Вы должны обрабатывать слайд «edit / delete / new», все в запросах ajax, которые включают колоду, которую вы создаете, когда кто-то создает «новую колоду».А затем в «Форме палубы» вы изменяете только свойства Deck, такие как имя и ассоциация.

Или, если вы склонны делать все новые элементы на самой странице без Ajax и создавать новый «слайд»объекты, вы можете использовать formset и сохранить колоду и все связанные слайды.

...