Когда я пытался понять FormWizard, я искал все и нашел ответы, такие как большинство из них, которые просто говорят, что не используют его. FormPreview будет работать нормально, так как OP интересует только одноуровневая форма, но вопрос о том, как использовать FormWizard, остается в силе.
Несмотря на то, что этот вопрос настолько старый, я думаю, что здесь полезно ответить, потому что этот вопрос задается на очень многих сайтах, и я не вижу ни сплоченного ответа на него, ни четкого решения в документах.
Я думаю, что с точки зрения вопроса OP, переопределение process_step - это путь. Хитрость заключается в создании формы (или представления) в этом методе, которая будет получать данные из первой формы.
Я добавил этот form_setup в мой forms.py в качестве служебной оболочки (думаю, конструктор):
def form_setup(**kwargs):
def makeform(data, prefix=None, initial=None):
form = FormLev2(data, prefix, initial)
for k, v in kwargs.items():
if k == 'some_list':
form.fields['some_list'].choices = v
...
return form
return makeform
Затем переопределите process_step следующим образом:
def process_step(self, request, process, step):
if step == 1
if form.is_valid(): #form from step 1
objs = Table.objects.filter(...) #based on last form
self.form_list[1] = form_setup(some_list=[(o.id,o.name) for o in objs]) #(*)
...
Таким образом, вы можете динамически изменять form_list (*) в том смысле, что вы изменяете form_list в экземпляре FormWizard, а не сами определения форм. Функция-обертка необходима для этой функции, так как она возвращает функцию, которая будет создавать новый объект Form, который затем используется в FormWizard для вызова с данными для следующей формы, и позволяет использовать данные из предыдущей формы. ,
Редактировать: для комментария Эрика и для уточнения последней части.
Также обратите внимание, что process_step будет вызываться с шагом [0, n] после шага n.