Django 如何在formtool向导的步骤中手动重置数据?
我有一个向导,包括以下几个步骤:Django 如何在formtool向导的步骤中手动重置数据?,django,python-3.x,django-formtools,Django,Python 3.x,Django Formtools,我有一个向导,包括以下几个步骤: 1 -> 2 -> 3 -> 4 -> 6 | ^ | | --> 5 --- 其中,步骤6只是对前面步骤中的数据进行审查。步骤4和步骤5是相互排斥的 如果用户使用表格1,2,3,4,6,然后决定使用5而不是4,我希望能够在步骤4中重置数据。 如何手动重置已为步骤4或向导的任何步骤存储的数据?这在django formtools中没有真正
1 -> 2 -> 3 -> 4 -> 6
| ^
| |
--> 5 ---
其中,步骤6只是对前面步骤中的数据进行审查。步骤4和步骤5是相互排斥的
如果用户使用表格1,2,3,4,6,然后决定使用5而不是4,我希望能够在步骤4中重置数据。
如何手动重置已为步骤4或向导的任何步骤存储的数据?这在django formtools中没有真正记录,但您会发现WizardView有一个属性self.storage,它是“formtools.wizard.storage.base”中BaseStorage的一个实例 self.storage.data是所有存储数据的字典。直接操作此字典有点危险,最好使用self.storage.set\u step\u datastep,data方法更改特定步骤的数据:
self.storage.set_step_data('4', {})
将清空步骤“4”的数据
注意:如果您也在上载文件,则应该删除它们,这有点棘手,因为self.storage.set_step_filestep,如果文件为空{},则文件不会起任何作用。查看该方法以覆盖它或查看如何从数据字典中删除文件。如DirkRoten答案注释中所述,我在表单向导中有一个步骤,即表单集。对于使用self.storage.set_step_datastep的此特定步骤,每次使用该步骤或该步骤的信息时,{}都会导致错误,因为正如dirkgroten在其注释中指出的那样,手动设置步骤的数据后,ManagementForm的信息丢失 因此,我最终只是从self.storage中删除步骤的键值对。通过这样做,我获得了表单向导的正常行为,例如self.get_cleaned_data_for_step如果步骤不在self.storage中,并且从self.storage中删除步骤后使用步骤时正确启动了表单集,则step返回None 要从self.storage中删除步骤,我使用formwizard中的process_步骤方法
当然,正如dirkgroten所提到的,这不会删除遗留文件。在WizardView中,self.storage是所有数据的存储对象,而self.storage.set_step_datastep,data会将特定步骤的数据设置为data。因此self.storage.set_step_data'4',{}将重置步骤4的数据。啊,您可能应该保留管理表单数据。查看调试器中的数据。我认为问题在于步骤上传了一个文件,正如你在回答中提到的。我通过执行self.storage['step_files']['4']={}成功地重置了self.storage['step_files'],但你是对的。存在[ManagementForm数据丢失或已被篡改]错误。如何以及在何处保存表单集的值?
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)
#---