跳过Django的步骤FormWizard
问题描述:
我有一个应用程序,其中有5个步骤的FormWizard,其中一个应该只出现在满足一些条件时。跳过Django的步骤FormWizard
该表格适用于在线购物车上的付款向导,其中一个步骤应仅在有促销活动可用于购物时显示,但如果没有促销活动,我想跳过该步骤而不是显示空的促销清单。
所以我想有2个可能的流动:
step1 - step2 - step3
step1 - step3
答
钩子方法process_step()给你正是这样的机会。 表单验证后,您可以修改self.form_list变量,并删除不需要的表单。
针说如果你的逻辑非常复杂,你最好为每个步骤/表单创建单独的视图,并放弃FormWizard。
答
我这样做了,重写了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
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