使用JSON的Django导入向导

时间:2015-01-31 15:07:43

标签: django django-forms django-formwizard

我正在尝试创建一个向导,使用JSON在Django中导入几个模型。我希望能够:

  1. 转到entries/import/之类的网址,该网址会显示文字字段
  2. 我可以粘贴一些JSON条目并点击提交
  3. 然后会将我带到向导的第2步,在那里我将看到一个模型表单列表
  4. 在检查/更改某些数据时,我可以点击提交并保存所有条目
  5. 看起来我想将Form WizardFormSet结合使用。我已完成第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'))
    

1 个答案:

答案 0 :(得分:1)

您应该使用传递给step方法的get_form_initial参数,而不是使用self.storage.current_step。经过测试,我发现self.storage.current_step包含上一步。

另请注意,由于某种原因,get_form_initial会被处理两次,一次为先前,一次为当前步骤。