跳过Django的步骤FormWizard

问题描述:

我有一个应用程序,其中有5个步骤的FormWizard,其中一个应该只出现在满足一些条件时。跳过Django的步骤FormWizard

该表格适用于在线购物车上的付款向导,其中一个步骤应仅在有促销活动可用于购物时显示,但如果没有促销活动,我想跳过该步骤而不是显示空的促销清单。

所以我想有2个可能的流动:

step1 - step2 - step3 

step1 - step3 

钩子方法process_step()给你正是这样的机会。 表单验证后,您可以修改self.form_list变量,并删除不需要的表单。

针说如果你的逻辑非常复杂,你最好为每个步骤/表单创建单独的视图,并放弃FormWizard。

+6

process_step()方法用于在提交表单后对数据进行后处理。为了使某些表单可选,您可以在传递给FormView的表单列表中引入条件:https://docs.djangoproject.com/en/1.5/ref/contrib/formtools/form-wizard/#conditionally-view-skip特异性步骤 – tijs 2014-04-15 08:51:33

我这样做了,重写了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) 

为了使某些形式的可选可以在窗体列表介绍条件语句传递给FormView控件在你的urls.py:

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