2009-07-01 7 views
3

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

フォームはオンラインカートの支払いウィザードのためのもので、ステップの1つはサイクリング用のプロモーションがある場合にのみ表示する必要がありますが、プロモーションがない場合は、そのステップをスキップしてプロモーションの空のリスト。

step1 - step2 - step3 

step1 - step3 

答えて

6

フックメソッドprocess_step()はあなたに正確にその機会を与えてくれます:

は、だから私は2つの可能な流れを持っていると思います。 フォームの検証後、のself.form_list変数を変更し、必要のないフォームを削除することができます。

ロジックが非常に複雑な場合は、各ステップ/フォームごとに別々のビューを作成し、FormWizardを完全に継承する方がよいでしょう。

+6

process_step()メソッドは、フォームが送信された後にデータを後処理することを目的としています。任意のフォームをオプションにするには、FormViewに渡すフォームのリストに条件を導入することができます。https://docs.djangoproject.com/en/1.5/ref/contrib/formtools/form-wizard/#conditionally-view-skip固有のステップ – tijs

1

私はそれ以外の方法で、render_templateメソッドをオーバーライドしました。ここで私の解決策。私は特定の形態は、あなたがあなたのurls.pyにFormViewコントロールに渡すフォームの一覧に条件文を導入できるオプションにするには...)(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)