1

私はDjango 1.4.8を使用しています

前のステップで行った選択からフォームを動的に変更できますが、ここではより正確にする必要があります。

事実上、私のフォーム「ステップ 0」には、値を選択するドロップダウンがあり、ステップ 2 では、ステップ 0 で選択した値なしで「ステップ 0」と同じデータをロードする必要があります。

私はこのようにしました:

urls.py :

# wizard
url(r'^service/create/$',
    UserServiceWizard.as_view([ProviderForm,
                               DummyForm,
                               ConsummerForm,
                               DummyForm,
                               ServicesDescriptionForm]),

ビュー.py

def get_form(self, step=None, data=None, files=None):
    """
        change the form instance dynamically from the data we entered
        at the previous step
    """
    #
    if step is None:
        step = self.steps.current

    if step == '1':

        prev_data = self.get_cleaned_data_for_step('0')
        service_name = str(prev_data['provider']).split('Service')[1]
        class_name = 'th_' + service_name.lower() + '.forms'
        form_name = service_name + 'ProviderForm'
        form_class = class_for_name(class_name, form_name)
        form = form_class(data)

    elif step == '2':
        data = self.get_cleaned_data_for_step('0')
        form = ConsummerForm(initial={'provider': data['provider']})

        # EDIT 10/16 @ 10:00 
        # to track what's wrong I added 
        print form['consummer'].errors #return nothing 
        print form.is_valid() #return false
        print "form.non_field_errors ", form.non_field_errors() #return nothing


    elif step == '3':

        prev_data = self.get_cleaned_data_for_step('2')
        service_name = str(prev_data['consummer']).split('Service')[1]
        class_name = 'th_' + service_name.lower() + '.forms'
        form_name = service_name + 'ConsummerForm'
        form_class = class_for_name(class_name, form_name)
        form = form_class(data)

    else:
        form = super(UserServiceWizard, self).get_form(step, data, files)

    return form

私のフォームは次のとおりです。

class ServiceChoiceForm(forms.Form):

    def activated_services(self, provider=None):
        """
        get the activated services added from the administrator
        """
        services = ServicesActivated.objects.filter(status=1)

        choices = []
        datas = ()

        if provider is not None:
            services = services.exclude(name__exact=provider)

        for class_name in services:
            datas = (class_name, class_name.name.rsplit('Service', 1)[1])
            choices.append(datas)

        return choices

class ProviderForm(ServiceChoiceForm):

    provider = forms.ChoiceField()

    def __init__(self, *args, **kwargs):
        super(ProviderForm, self).__init__(*args, **kwargs)
        self.fields['provider'].choices = self.activated_services()


class ConsummerForm(ServiceChoiceForm):

    consummer = forms.ChoiceField()

    def __init__(self, *args, **kwargs):
        super(ConsummerForm, self).__init__(*args, **kwargs)
        # get the list of service without the one selected in
        # the provider form
        self.fields['consummer'].choices = self.activated_services(
            self.initial['provider'])

今何が起こったのですか:

「ステップ 2」のフォームでデータを送信すると、無期限に「ステップ 2」に戻ります

の部分をelif step == '2'入れget_form()ず、同じコードをフォームフォームの ConsummerForm に入れない場合:

self.fields['consummer'].choices = self.activated_services()

その後、プロセスは続行しますが、それは私が望むものではありません:(

last thingsget_form() "= "step 0" の後に が呼び出される回数が多すぎる ことに気付きました: 実際には 4 回 . print form,stepin で追跡しましたget_form()が、フォームは決して期待されたものではありません.

ウィザードで無限ループの動作を修正する方法を誰かが説明できる場合; 私は大いに感謝します;)

4

1 に答える 1

0

私は解決策を見つけました:

ステップ2で私はこれをしなければなりません

    elif step == '2':
        step0_data = self.get_cleaned_data_for_step('0')
        form = ConsummerForm(
            data, initial={'provider': step0_data['provider']})

それ以外の

    elif step == '2':
        data = self.get_cleaned_data_for_step('0')
        form = ConsummerForm(initial={'provider': data['provider']})

最初のコードでは、2番目のコードで誤って行ったように「データ」dictを上書きしなかったため...

今、すべてがうまくいきます!

于 2013-10-16T08:34:43.973 に答える