使用 JSON 的 Django 导入向导

Posted

技术标签:

【中文标题】使用 JSON 的 Django 导入向导【英文标题】:Django import wizard using JSON 【发布时间】:2015-03-30 22:36:54 【问题描述】:

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

    转到entries/import/ 之类的 URL,它将显示一个文本字段 我可以在其中粘贴一些 JSON 条目并点击提交 然后我将进入向导的第 2 步,在该步骤中我将看到一个模型表单列表 在检查/更改某些数据时,我可以点击提交并保存所有条目

看起来我想将Form Wizard 与FormSet 结合使用。我已经完成了第 1 步和第 2 步,但我不知道如何在向导的第 2 步中将所有模型显示为表单。

我遇到了this link,它显示了我可以将 JSON 转换为 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'))

【问题讨论】:

也许让第 2 步重定向到一个特定的 url,在其中添加刚刚创建的模型的 ID 并显示它们。您只需编写一个 httpresponse 然后发送它。您似乎也有一个错字:revierse_lazy 目的是在提交 step2 之前不创建模型,因此在 step2 期间它们不会有 ID。我最终希望允许用户选择在第 2 步中创建哪些条目,但我认为最初的步骤是创建所有条目。我也想保持 URL 干净。感谢您指出错字。 【参考方案1】:

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

还要注意,由于某种原因,get_form_initial 被处理了两次,一次用于上一步,一次用于当前步骤。

【讨论】:

这有助于进入get_form_initial 中的 step2 条件,但我仍然没有在 step2 中获得任何表单。

以上是关于使用 JSON 的 Django 导入向导的主要内容,如果未能解决你的问题,请参考以下文章

mysql 表导入向导无法导入 csv 文件

如何将 JSON 文件导入 Django 数据库?

使用导入向导导入 CSV 时 MYSQL 崩溃

使用导入和导出向导将平面文件导入 SQL Server

在 MySQL Workbench 中,使用“表数据导入向导”导入 CSV 会创建空表

为啥 MySQL Workbench 表数据导入向导会导入 0 条记录?