0

我有一个向导,其中包含以下几个步骤:

1 -> 2 -> 3 -> 4 -> 6
          |         ^
          |         |
           --> 5 ---

其中第 6 步只是对前面步骤中的数据的回顾。第 4 步和第 5 步是互斥的。

如果用户使用 1、2、3、4、6 表格,然后决定使用 5 而不是 4,我希望能够在第 4 步中重置数据。如何手动重置已为第 4 步存储的数据(或任何步骤)的向导?

4

2 回答 2

1

这在 django-formtools 中并没有真正记录,但你会发现它WizardView有一个属性self.storage,它是BaseStorage(在'formtools.wizard.storage.base'中)的一个实例。

self.storage.data是所有存储数据的字典。直接操作这个字典有点危险,最好使用该方法self.storage.set_step_data(step, data)更改特定步骤的数据:

self.storage.set_step_data('4', {})

将清空步骤“4”的数据。

注意:如果您还上传文件,则应该删除它们,这有点棘手,因为如果为空 ( )self.storage.set_step_files(step, files)则不会执行任何操作。查看该方法以覆盖它或查看如何从数据字典中删除文件。files{}

于 2020-01-28T10:53:54.420 回答
0

正如对 dirkgroten 答案的评论中所讨论的那样,我step在表单向导中有一个formset. 对于此特定步骤self.storage.set_step_data(step, {}),每次使用step或 的信息时都会导致错误step,因为正如 dirkgroten 在他的评论中指出的那样,ManagementForm在手动设置 的数据后缺少 的信息step

因此,我最终只是简单地删除了key-valuestepfrom self.storage。通过这样做,我得到了表单向导的正常行为,例如,如果不在,则self.get_cleaned_data_for_step(step)返回,并且在使用after remove from时正确启动。Nonestepself.storageformsetstepstepself.storage

要从中删除stepself.storage我使用process_stepformwizard.

def process_step(self, form):
    """ Process the form after step data is submitted and validated by jQuery.  """
 #--> Get form prefix
    prefix = form.prefix
 #--> Action per step
    if prefix == 'e':
     #--> Set previous experiment
        try:
            exp_save = self.get_cleaned_data_for_step('e')
            if exp_save is None:
                pass
            else:
                exp_save = exp_save['e_exp'].id
        except KeyError:
            exp_save = None
     #--> Get selected experiment
        exp_sel = form.cleaned_data['e_exp'].id
     #--> Compare and delete steps if needed
        if exp_save is None:
            pass
        else:           
            if exp_sel == exp_save:
                pass
            else:
                for stepN in self.delStep[exp_sel]:
                 #--> self.delStep is a dict with the steps to be deleted for each exp_sel
                    if stepN in self.storage.data['step_data'].keys():
                     #--> Remove the key-value pair from data and files if there is already something to delete
                        del self.storage.data['step_data'][stepN]
                        del self.storage.data['step_files'][stepN]
                    else:
                        pass                
    else:
        pass
 #--> Return as implemented in the base class
    return self.get_form_step_data(form)
#---

当然,正如 dirkgroten 也提到的,这不会删除剩余文件。

于 2020-01-31T06:08:52.067 回答