我正在尝试创建一个向导,使用JSON在Django中导入几个模型。我希望能够:
entries/import/
之类的网址,该网址会显示文字字段看起来我想将Form Wizard与FormSet结合使用。我已完成第1步和第2步,但我无法弄清楚如何在向导的第2步中将所有模型显示为表单。
我遇到过this link,它显示了我可以将JSON转换为FormSet的位置,但是我还没有能够让它工作。以下是我认为相关的代码。你能帮我弄清楚如何将formset传递给 step2 吗?
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['text', 'tags']
class ImportForm(forms.Form):
json = forms.CharField(widget=forms.Textarea, label='JSON')
class ImportSelectionForm(forms.Form):
entryFormSet = formset_factory(EntryForm)
FORMS = (
("step1", ImportForm),
("step2", ImportSelectionForm),
)
TEMPLATES = {
"step1": "entries/json_form.html",
"step2": "entries/entry_import_form.html",
}
class ImportWizard(SessionWizardView):
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
def get_form_initial(self, step):
current_step = self.storage.current_step
if current_step == 'step2':
# Not getting here for some reason after submitting step1
prev_data = self.storage.get_step_data('step1')
json = prev_data.get('step1-json', '')
models = serializers.deserialize("json", json)
EntryFormSet = formset_factory(EntryForm)
formset = EntryFormSet(self.request.POST, self.request.FILES)
return self.initial_dict.get(step, {'formset': formset})
return self.initial_dict.get(step, {})
def done(self, form_list, **kwargs):
return HttpResponseRedirect(revierse_lazy('entries:index'))
答案 0 :(得分:1)
您应该使用传递给step
方法的get_form_initial
参数,而不是使用self.storage.current_step
。经过测试,我发现self.storage.current_step
包含上一步。
另请注意,由于某种原因,get_form_initial
会被处理两次,一次为先前,一次为当前步骤。