0

完全な問題ステートメントには複数のステップが含まれますが、その中心にあるのは次の単純なシナリオです。

2つのフォームがあるとしましょう

from django import forms

class Form1(forms.Form):
    char_field1=forms.CharField(label='field 1')
    char_field2=forms.CharField(label='field 2')
    char_field3=forms.CharField(label='field 3')

class Form2(forms.Form):
    choice_field = forms.ChoiceField()

またはそのサブクラスを使用しdjango.contrib.formtools.wizard.views.WizardViewて、choice_field に、ユーザーがchar_field1-で入力したオプションを入力したいと思いますchar_field3

get_formForm2 が返されるときに、choice_field をオーバーライドして入力しようとしました。レンダリングされたフォームにオプションが表示されましたが、フォームは送信時に検証されませんでした。

私の直感はそれが可能であるべきだと言っています.「方法」は私が理解できないものです.

4

2 に答える 2

0

次のようにできます。

ビュー.py:

from django.contrib.formtools.wizard.views import CookieWizardView

class ChoiceWizardView(CookieWizardView):
    def done(self, form_list, **kwargs):
        pass

    def get_form(self, step=None, data=None, files=None):
        form = super(ChoiceWizardView, self).get_form(step, data, files)
        if 'choice_field' in form.fields:
            form1_cleaned_data = self.get_cleaned_data_for_step('0')
            if form1_cleaned_data:
                form.fields['choice_field'].choices = [item for item in form1_cleaned_data.items()]
        return form

urls.py:

from app.forms import Form1, Form2
from app.views import ChoiceWizardView

urlpatterns = patterns('',
    (r'^my_wizard/$', ChoiceWizardView.as_view([Form1, Form2])),
)

それが動作します。しかし、間違ったアプリケーション アーキテクチャを選択したのではないでしょうか?

于 2012-11-20T19:15:58.230 に答える