4

5 つのステップを持つ FormWizard があるアプリケーションを使用しています。そのうちの 1 つは、いくつかの条件が満たされた場合にのみ表示されます。

フォームはオンライン カートの支払いウィザード用です。ステップの 1 つは、プロモーションが利用できる場合にのみ表示されますが、プロモーションがない場合は、プロモーションの空のリストを表示するのではなく、そのステップをスキップしたいと考えています。 .

だから私は2つの可能なフローを持ちたい:

step1 - step2 - step3

step1 - step3
4

4 に答える 4

7

フック メソッドprocess_step()はまさにその機会を提供します。フォームが検証されたら、self.form_list変数を変更して、不要なフォームを削除できます。

言うまでもなく、ロジックが非常に複雑な場合は、ステップ/フォームごとに個別のビューを作成し、FormWizard をまったく使用しない方がよいでしょう。

于 2009-07-03T15:27:33.810 に答える
4

特定のフォームをオプションにするために、urls.py で FormView に渡すフォームのリストに条件を導入できます。

contact_forms = [ContactForm1, ContactForm2]

urlpatterns = patterns('',
    (r'^contact/$', ContactWizard.as_view(contact_forms,
        condition_dict={'1': show_message_form_condition}
    )),
)

完全な例については、Django ドキュメントを参照してください: https://django-formtools.readthedocs.io/en/latest/wizard.html#conditionally-view-skip-specific-steps

于 2014-04-15T08:54:10.240 に答える
1

render_template メソッドをオーバーライドして、別の方法でそれを行いました。ここに私の解決策があります。process_step() について知りませんでした...

def render_template(self, request, form, previous_fields, step, context):

    if not step == 0:
        # A workarround to find the type value!
        attr = 'name="0-type" value='
        attr_pos = previous_fields.find(attr) + len(attr)
        val = previous_fields[attr_pos:attr_pos+4]
        type = int(val.split('"')[1])

        if step == 2 and (not type == 1 and not type == 2 and not type == 3):
            form = self.get_form(step+1)
            return super(ProductWizard, self).render_template(request, form, previous_fields, step+1, context)

    return super(ProductWizard, self).render_template(request, form, previous_fields, step, context)
于 2009-07-17T17:04:43.307 に答える
0

これにはさまざまな方法がありますが(他の回答で述べたように)、メソッドを上書きすることが役立つと思われる解決策の1つですget_form_list()

何かのようなもの:

from collections import OrderedDict 
def get_form_list(self):

        form_list = OrderedDict()

        // add some condition based on the earlier forms
        cleaned_data = self.get_cleaned_data_for_step('step1') or {}

        for form_key, form_class in self.form_list.items():
            if cleaned_data and cleaned_data['step1'] == 'X':
                 if form_key == 'step2':
                    #skip step2
                    continue
                 else:
                    pass
            elif cleaned_data and cleaned_data['step1'] == 'Y':
                 if form_key == 'step4':
                     #skip step4
                     continue
                 else:
                     pass

              ....
                  
            # try to fetch the value from condition list, by default, the form
            # gets passed to the new list.
            condition = self.condition_dict.get(form_key, True)
            if callable(condition):
                # call the value if needed, passes the current instance.
                condition = condition(self)
            if condition:
                form_list[form_key] = form_class
        return form_list

このようにすれば、複雑なフォームを処理でき、他のものと競合することはないと思います。

于 2020-12-04T17:23:01.133 に答える