Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在formtool向导的步骤中手动重置数据?_Django_Python 3.x_Django Formtools - Fatal编程技术网

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)
#---