Django表单向导使用条件逻辑跳过多个步骤

5gfr0r5j  于 2023-02-05  发布在  Go
关注(0)|答案(3)|浏览(138)

有没有什么方法可以跳过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,} ))

我真的被如何破解这个难题难住了。如果你能提供任何指导,我将非常感激。

t2a7ltrp

t2a7ltrp1#

指定FormWizard何时跳过一个步骤的典型方法是使用condition_dictionary。Django使用该结构来只包含一个步骤的表单,当条件(设置为callables)

# 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',) 
)
pjngdqdw

pjngdqdw2#

谢谢你的回答,Paulo!这正是轻松跳过表单页面所需要的。根据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',) 
)
qqrboqgw

qqrboqgw3#

按照这个逻辑,进入第一步,函数return_true执行了4次,check_step_two执行了8次,为什么呢?另外,继续到第二步,函数return_true执行了,为什么呢?

相关问题