Django 表单向导使用条件逻辑跳过多个步骤
Django Form Wizard Skip Multiple Steps with Conditional Logic
有什么方法可以跳过 Django 的表单向导(即 SessionWizardView)中的多个步骤吗?
我知道可以使用 condition_dict 生成以下表单显示逻辑:
第 1 页 -> 第 3 页
#urls.py
path('main/', MyWizard.as_view(set_of_forms, condition_dict={'1': view_condition} ))
我想做的是:
第 1 页 --> 第 4 页
据推测,在第1页的内容基础上加个condition_dict应该可以跳过第3页,但是不行。例如:
#urls.py
path('main/', MyWizard.as_view(set_of_forms, condition_dict={'1': view_condition, '2': view_condition2,} ))
我真的不知道如何解决这个问题。如果您能提供任何指导,我们将不胜感激。
指定 FormWizard 何时跳过步骤的典型方法是使用 condition_dictionary。 Django 使用该结构仅在条件(设置为可调用项)
时包含步骤的表单
# I always specify index values for steps so that all functions can share them
STEP_ONE = u'0'
STEP_TWO = u'1'
STEP_THREE = u'2'
def MyWizard(SessionWizardView):
# Your form wizard itself; will not be called directly by urls.py, but rather wrapped in a function that provide the condition_dictionary
_condition_dict = { # a dictionary with key=step, value=callable function that return True to show step and False to not
STEP_ONE: return_true, # callable function that says to always show this step
STEP_TWO: check_step_two, # conditional callable for verifying whether to show step two
STEP_THREE: return_true, # callable function that says to always show this step
}
_form_list = [ # a list of forms used per step
(STEP_ONE,your_forms.StepOneForm),
(STEP_TWO, your_forms.StepTwoForm),
(STEP_THREE, your_forms.StepThreeForm),
]
...
def return_true(wizard): # callable function called in _condition_dict
return True # a condition that is always True, for when you always want form seen
def check_step_two(wizard): # callable function called in _condition_dict
step_1_info = wizard.get_cleaned_data_for_step(STEP_ONE)
# do something with info; can retrieve for any prior steps
if step_1_info == some_condition:
return True # show step 2
else: return False # or don't
''' urls.py '''
your_form_wizard = MyWizard.as_view(MyWizard._form_list,condition_dict= MyWizard._condition_dict)
urlpatterns = patterns('',
...
url(r'^form_wizard_url/$', your_form_wizard, name='my-form-wizard',)
)
保罗,谢谢您的回答!这正是轻松跳过表单页面所需要的。基于 Paulo 的回答,需要进行三处更改才能同时跳过 多个 步骤:
# I always specify index values for steps so that all functions can share them
STEP_ONE = u'0'
STEP_TWO = u'1'
STEP_THREE = u'2'
def MyWizard(SessionWizardView):
# Your form wizard itself; will not be called directly by urls.py, but rather wrapped in a function that provide the condition_dictionary
# **Change1**: functions need to be stated before the dictionary
def return_true(wizard): # callable function called in _condition_dict
return True # a condition that is always True, for when you always want form seen
# **Change 2:** Only proceed with the logic if the step is valid
def check_step_two(wizard): # callable function called in _condition_dict
step_1_info = wizard.get_cleaned_data_for_step(STEP_ONE)
# do something with info; can retrieve for any prior steps
if step_1_info != None:
if step_1_info == some_condition:
return True # show step 2
else: return False # or don't
# **Change 3**: a condition must be added to skip an additional form
_condition_dict = { # a dictionary with key=step, value=callable function that return True to show step and False to not
STEP_ONE: return_true, # callable function that says to always show this step
STEP_TWO: check_step_two, # conditional callable for verifying whether to show step two
STEP_THREE: check_step_two, # conditional callable for verifying whether to show step three
STEP_FOUR: return_true, # callable function that says to always show this step
}
_form_list = [ # a list of forms used per step
(STEP_ONE,your_forms.StepOneForm),
(STEP_TWO, your_forms.StepTwoForm),
(STEP_THREE, your_forms.StepThreeForm),
(STEP_THREE, your_forms.StepFourForm),
]
...
''' urls.py '''
your_form_wizard = MyWizard.as_view(MyWizard._form_list,condition_dict= MyWizard._condition_dict)
urlpatterns = patterns('',
...
url(r'^form_wizard_url/$', your_form_wizard, name='my-form-wizard',)
)
有什么方法可以跳过 Django 的表单向导(即 SessionWizardView)中的多个步骤吗?
我知道可以使用 condition_dict 生成以下表单显示逻辑: 第 1 页 -> 第 3 页
#urls.py
path('main/', MyWizard.as_view(set_of_forms, condition_dict={'1': view_condition} ))
我想做的是: 第 1 页 --> 第 4 页
据推测,在第1页的内容基础上加个condition_dict应该可以跳过第3页,但是不行。例如:
#urls.py
path('main/', MyWizard.as_view(set_of_forms, condition_dict={'1': view_condition, '2': view_condition2,} ))
我真的不知道如何解决这个问题。如果您能提供任何指导,我们将不胜感激。
指定 FormWizard 何时跳过步骤的典型方法是使用 condition_dictionary。 Django 使用该结构仅在条件(设置为可调用项)
时包含步骤的表单# I always specify index values for steps so that all functions can share them
STEP_ONE = u'0'
STEP_TWO = u'1'
STEP_THREE = u'2'
def MyWizard(SessionWizardView):
# Your form wizard itself; will not be called directly by urls.py, but rather wrapped in a function that provide the condition_dictionary
_condition_dict = { # a dictionary with key=step, value=callable function that return True to show step and False to not
STEP_ONE: return_true, # callable function that says to always show this step
STEP_TWO: check_step_two, # conditional callable for verifying whether to show step two
STEP_THREE: return_true, # callable function that says to always show this step
}
_form_list = [ # a list of forms used per step
(STEP_ONE,your_forms.StepOneForm),
(STEP_TWO, your_forms.StepTwoForm),
(STEP_THREE, your_forms.StepThreeForm),
]
...
def return_true(wizard): # callable function called in _condition_dict
return True # a condition that is always True, for when you always want form seen
def check_step_two(wizard): # callable function called in _condition_dict
step_1_info = wizard.get_cleaned_data_for_step(STEP_ONE)
# do something with info; can retrieve for any prior steps
if step_1_info == some_condition:
return True # show step 2
else: return False # or don't
''' urls.py '''
your_form_wizard = MyWizard.as_view(MyWizard._form_list,condition_dict= MyWizard._condition_dict)
urlpatterns = patterns('',
...
url(r'^form_wizard_url/$', your_form_wizard, name='my-form-wizard',)
)
保罗,谢谢您的回答!这正是轻松跳过表单页面所需要的。基于 Paulo 的回答,需要进行三处更改才能同时跳过 多个 步骤:
# I always specify index values for steps so that all functions can share them
STEP_ONE = u'0'
STEP_TWO = u'1'
STEP_THREE = u'2'
def MyWizard(SessionWizardView):
# Your form wizard itself; will not be called directly by urls.py, but rather wrapped in a function that provide the condition_dictionary
# **Change1**: functions need to be stated before the dictionary
def return_true(wizard): # callable function called in _condition_dict
return True # a condition that is always True, for when you always want form seen
# **Change 2:** Only proceed with the logic if the step is valid
def check_step_two(wizard): # callable function called in _condition_dict
step_1_info = wizard.get_cleaned_data_for_step(STEP_ONE)
# do something with info; can retrieve for any prior steps
if step_1_info != None:
if step_1_info == some_condition:
return True # show step 2
else: return False # or don't
# **Change 3**: a condition must be added to skip an additional form
_condition_dict = { # a dictionary with key=step, value=callable function that return True to show step and False to not
STEP_ONE: return_true, # callable function that says to always show this step
STEP_TWO: check_step_two, # conditional callable for verifying whether to show step two
STEP_THREE: check_step_two, # conditional callable for verifying whether to show step three
STEP_FOUR: return_true, # callable function that says to always show this step
}
_form_list = [ # a list of forms used per step
(STEP_ONE,your_forms.StepOneForm),
(STEP_TWO, your_forms.StepTwoForm),
(STEP_THREE, your_forms.StepThreeForm),
(STEP_THREE, your_forms.StepFourForm),
]
...
''' urls.py '''
your_form_wizard = MyWizard.as_view(MyWizard._form_list,condition_dict= MyWizard._condition_dict)
urlpatterns = patterns('',
...
url(r'^form_wizard_url/$', your_form_wizard, name='my-form-wizard',)
)