使用 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 导入向导的主要内容,如果未能解决你的问题,请参考以下文章