问题:你可以在django中使用Form Wizard for Model Forms吗?

我有一个模型,我使用ModelForm从模型中创建了一个表格。现在,我想将表单分布在两个页面上。例如,前三个字段将出现在第一页上,然后用户单击下一步,最后三个字段将出现在第二页上。然后他点击提交,用户提交的数据被添加到数据库中。

我查看了表单向导的文档,它似乎也适用于模型表单?有人可以证实这一点吗?

如果是这样,有人可以解释创建WizardView类的过程。

这个例子在文档中给出,我不明白后两个参数是什么。 form_list 只是您根据表单类实例化的表单对象列表吗?什么是**kwargs?

class ContactWizard(SessionWizardView):
    def done(self, form_list, **kwargs):
        do_something_with_the_form_data(form_list)
        return HttpResponseRedirect('/page-to-redirect-to-when-done/')

在此先感谢您的帮助!

解答

表单向导被内置到 Django 1.4 中,所以这是一个很好的方法。它应该做你想做的事,但你可能需要一些调整。

现在不要担心done()中的kwargs- 你不会需要它们。

form_list是您要用于步骤的表单列表 - 来自urls.py

urlpatterns = patterns('',
    (r'^contact/$', ContactWizard.as_view([ContactForm1, ContactForm2])),
)

[ContactForm1, ContactForm2]将作为form_list传递给done()

您需要做的是将您的ModelForm分解为单独的表格。最简单的方法(如果您希望您的模型在多个表单上)是不使用ModelForm而只是创建自己的表单。这很容易:

from django import forms

class ContactForm1(forms.Form):
    subject = forms.CharField(max_length=100)
    sender = forms.EmailField()

class ContactForm2(forms.Form):
    message = forms.CharField(widget=forms.Textarea)

一旦您的表单反映了模型的各个部分,只需按照文档中的描述创建viewspatterns,并将do_something_with_the_form_data(form_list)设置为从表单数据完成模型然后进行保存的函数。

您可以使用ModelForm但 - 只有当您可以说服它为表单向导生成不同的表单以用于每个步骤时 - 这将是棘手的部分。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐