скажем, ваша модель имеет два поля
class AModel( Model ):
fieldA = CharField()
fieldB = CharField()
Мы хотим установить каждое поле на отдельном шаге, используя FormWizard
. Итак, мы создаем два ModelForm
с, каждое из которых показывает одно поле:
class Form1( ModelForm ):
class Meta:
model = AModel
fields = ( 'fieldA', )
class Form2( ModelForm ):
class Meta:
model = AModel
fields = ( 'fieldB', )
Мы называем наш мастер форм AWizard
; запись url.py
должна выглядеть примерно так:
url( r'^$', AWizard.as_view( [ Form1, Form2 ] ) ),
В реализации AWizard
нам нужно убедиться, что все формы записывают свои данные в один экземпляр, который мы затем сохраняем в базе данных:
class AWizard( SessionWizardView ):
instance = None
def get_form_instance( self, step ):
if self.instance is None:
self.instance = AModel()
return self.instance
def done( self, form_list, **kwargs ):
self.instance.save()
Обратите внимание, что мы переопределяем метод get_form_instance
. Этот метод возвращает экземпляр модели, с которой связаны формы.
Вы можете подумать (я так и сделал), что этот метод создает экземпляр для первого запроса (первый шаг мастера), а затем продолжает использовать этот же экземпляр для всех шагов.
На самом деле, это немного сложнее. Для каждого запроса создается новый экземпляр AWizard
, который, в свою очередь, создает новый экземпляр AModel
. Таким образом, шаги не разделяют один экземпляр для начала.
Магия происходит, когда отправляется последняя форма. На этом этапе все формы проходят повторную проверку, каждая форма вызывает get_form_instance
, и в итоге они заполняют один AModel
экземпляр.
Этот экземпляр затем сохраняется в done
.