0

私は webapp を作成中ですが、この webapp にはフォーム ウィザードが必要です。ウィザードは 3 つの ModelForms で構成されており、問題なく動作します。しかし、2 番目のフォームを「編集フォーム」にする必要があります。つまり、インスタンスに渡されるフォームである必要があります。

フォーム ウィザードでこれを行うにはどうすればよいでしょうか。モデルのインスタンスをどのように渡しますか? FormWizard クラスには get_form メソッドがあるようですが、フォームウィザードを使用してデータを編集/確認する方法が文書化されていませんか?

4

3 に答える 3

4

Django 1.4 では、次のようなことができます。

def edit(request):
    initial = {
       0: {'subject': 'Hello', 'sender': 'user@example.com'},
       1: {'message': 'Hi there!'}
       }
    wiz = FormWizard([form1,form2,form3],initial_dict = initial)
    return wiz(request)
于 2012-07-16T15:39:56.520 に答える
0

ビューでformwizardクラスを使用して、次のようにイニシャルを渡すことができます。

def edit(request):
    initial = {0: {'field1':'value1'}}
    return FormWizard([form, some_other_form], initial=initial)

ここで、initialはステップに等しいキーを持つdictであり、valuesは通常の形式と同じようにデータのdictです。

于 2010-04-06T10:45:00.440 に答える
0

渡すデータの複雑さに応じて、いくつかのアプローチがあると思います。

https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#providing-initial-data-for-the-formsの指示に従って 、最初の辞書を作成します。次のように urls.py のビューに渡します。

>>> initial = {
...     '0': {'subject': 'Hello', 'sender': 'user@example.com'},
...     '1': {'message': 'Hi there!'}
... }
>>> wiz = ContactWizard.as_view([ContactForm1, ContactForm2], initial_dict=initial)

もう 1 つのオプションは、これはより複雑ですが、もう少しロジックを追加できるようにするため、get_initkwargs をオーバーライドしてそこにロジックを配置することです (Django コード: https://github.com/django/django/blob/を参照)。 master/django/contrib/formtools/wizard/views.py )。

最後に、前のフォームの入力に基づいてオブジェクトを提供する必要がある場合、get_initkwargs はクラス メソッドであり、ウィザードの開始時に初期辞書を渡す必要があるため、非常に複雑になります。しかし、おそらく get_form_kwargs をオーバーライドすることでそれを行うことができます:

def get_form_kwargs(self, step=None):
    kwargs = {}
    if step != '0':
        your_field = self.get_cleaned_data_for_step('0')['your_field']
        # logic for getting object based on field goes here
        kwargs.update({'object': object,})
    return kwargs

次に、フォームのinitメソッドを使用して、kwargs で渡したオブジェクトに基づいて初期値を設定できます。最後のコードはよく使いますが、以前のものはあまり使用していません。

于 2012-10-24T21:07:19.763 に答える