你可以在django中使用模板表单的表单向导吗?

10 python django django-models

我有一个模型,我用模型创建了一个模型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/')
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

wue*_*erg 23

假设您的模型有两个字段

class AModel( Model ):
    fieldA = CharField()
    fieldB = CharField()
Run Code Online (Sandbox Code Playgroud)

我们希望使用a在单独的步骤中设置每个字段FormWizard.所以我们创建了两个ModelForms,每个都显示一个字段:

class Form1( ModelForm ):
    class Meta:
        model = AModel
        fields = ( 'fieldA', )

class Form2( ModelForm ):
    class Meta:
        model = AModel
        fields = ( 'fieldB', )
Run Code Online (Sandbox Code Playgroud)

我们称之为表单向导AWizard; 该url.py条目应该看起来像

url( r'^$', AWizard.as_view( [ Form1, Form2 ] ) ),
Run Code Online (Sandbox Code Playgroud)

在实现中,AWizard我们需要确保所有表单将其数据写入单个实例,然后我们将其保存到数据库:

class AWizard( SessionWizardView ):
    instance = None

    def get_form_instance( self, step ):
        if self.instance is None:
            self.instance = AModel()
        return self.instance

    def done( self, form_list, **kwargs ):
        self.instance.save()
Run Code Online (Sandbox Code Playgroud)

请注意,我们覆盖了该方法get_form_instance.此方法返回表单绑定到的模型实例.

您可能认为(我这样做),此方法为第一个请求(向导的第一步)创建实例,然后继续对所有步骤使用相同的实例.

实际上,它有点复杂.对于每个请求AWizard,都会创建一个新AModel实例,从而创建一个新实例.因此,这些步骤不会共享一个实例.

提交最后一个表单时会发生魔力.此时,所有表单都被重新验证,每个表单调用get_form_instance,最终填充单个AModel实例.

然后保存该实例done.


dan*_*van 6

表单向导正在构建到Django 1.4中,因此这是一个很好的方法.它应该做你想要的,但你可能需要做一些调整.

不要担心kwargsdone()此刻-你不会需要他们.

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

urlpatterns = patterns('',
    (r'^contact/$', ContactWizard.as_view([ContactForm1, ContactForm2])),
)
Run Code Online (Sandbox Code Playgroud)

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

您需要做的是将您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)
Run Code Online (Sandbox Code Playgroud)

一旦你的形式反映了模型的部分,只需要创建viewspatterns作为描述文档,并设置do_something_with_the_form_data(form_list)于从形式的数据完成了模型中的一个函数,然后做了保存.

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

  • 如果选择使用`ModelForm`,则可以使用`fields`或`excludes`来控制每个步骤可见的字段. (7认同)