我有一个向导,其中包含以下几个步骤:
1 -> 2 -> 3 -> 4 -> 6
| ^
| |
--> 5 ---
其中第 6 步只是对前面步骤中的数据的回顾。第 4 步和第 5 步是互斥的。
如果用户使用 1、2、3、4、6 表格,然后决定使用 5 而不是 4,我希望能够在第 4 步中重置数据。如何手动重置已为第 4 步存储的数据(或任何步骤)的向导?
我有一个向导,其中包含以下几个步骤:
1 -> 2 -> 3 -> 4 -> 6
| ^
| |
--> 5 ---
其中第 6 步只是对前面步骤中的数据的回顾。第 4 步和第 5 步是互斥的。
如果用户使用 1、2、3、4、6 表格,然后决定使用 5 而不是 4,我希望能够在第 4 步中重置数据。如何手动重置已为第 4 步存储的数据(或任何步骤)的向导?
这在 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
{}
正如对 dirkgroten 答案的评论中所讨论的那样,我step
在表单向导中有一个formset
. 对于此特定步骤self.storage.set_step_data(step, {})
,每次使用step
或 的信息时都会导致错误step
,因为正如 dirkgroten 在他的评论中指出的那样,ManagementForm
在手动设置 的数据后缺少 的信息step
。
因此,我最终只是简单地删除了key
-value
对step
from self.storage
。通过这样做,我得到了表单向导的正常行为,例如,如果不在,则self.get_cleaned_data_for_step(step)
返回,并且在使用after remove from时正确启动。None
step
self.storage
formset
step
step
self.storage
要从中删除step
,self.storage
我使用process_step
了formwizard
.
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 也提到的,这不会删除剩余文件。