【问题标题】:Django Form Wizard Skip Multiple Steps with Conditional LogicDjango 表单向导使用条件逻辑跳过多个步骤
【发布时间】:2021-06-15 11:46:16
【问题描述】:

有没有办法跳过 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,} ))

我真的不知道如何破解这个坚果。非常感谢您提供的任何指导。

【问题讨论】:

    标签: django django-forms django-formwizard


    【解决方案1】:

    指定 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',) 
    )
    

    【讨论】:

    • 谢谢你,@PauloRodrigues!您的回答非常清楚,非常有帮助。我已经重新发布了您的答案,并进行了一些小改动,说明如何可以跳过多个步骤。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多