Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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 Formwizard 1.4中的步骤?_Django_Django 1.4_Formwizard - Fatal编程技术网

如何动态重复Django Formwizard 1.4中的步骤?

如何动态重复Django Formwizard 1.4中的步骤?,django,django-1.4,formwizard,Django,Django 1.4,Formwizard,我试图根据步骤中的复选框有条件地重复Django Formwizard(Django 1.4)中的一个步骤。表单创建一个对象,并有一个复选框(希望如此),允许他们重复该步骤,并使用相同的表单创建相同模型的另一个对象 我看到了这个答案:但不幸的是,我认为它只适用于FormWizard的旧版本 process\u step函数不再具有form\u list属性。它也没有当前步骤属性(或步骤属性),但我可以通过表单的QueryDict访问当前步骤。它包含一个表单字典,但我不认为在字典中插入另一个步骤会

我试图根据步骤中的复选框有条件地重复Django Formwizard(Django 1.4)中的一个步骤。表单创建一个对象,并有一个复选框(希望如此),允许他们重复该步骤,并使用相同的表单创建相同模型的另一个对象

我看到了这个答案:但不幸的是,我认为它只适用于FormWizard的旧版本

process\u step函数不再具有form\u list属性。它也没有当前步骤属性(或步骤属性),但我可以通过表单的QueryDict访问当前步骤。它包含一个表单字典,但我不认为在字典中插入另一个步骤会起到任何作用,不幸的是,因为它是一个字典而不是一个列表,我必须在插入它的位置后修改每个步骤键

那么,使用Django 1.4 FormWizard向表单列表中添加新步骤有什么好方法吗

更新——开始认为覆盖get_next_步骤(self,step)可能是一种方法,但任何输入都非常感谢


更新#2--尝试在下一步使用get#u,但无法将新表单插入实例的表单列表。这并不意味着这是不可能的——想法?

嗯,我想出了一些办法。您可以覆盖get_form_list以将内容插入表单列表,但您必须将它们保存在self.form_list中,并且只返回表单列表。就我的目的而言,这是可以的,但是如果您也使用条件dict,那么在这里您必须小心

def get_form_list(self):
    s = self.storage.current_step                                                                
    s_data = self.get_cleaned_data_for_step(s) or {}                                             
    add_another = s_data.get('add_another', False)                                   
    if add_another is True:                                                                      
        index = self.form_list.keyOrder.index(s)+1                                               
        key = "add_another-{0}".format(index)
        self.form_list.insert(index, key,                                                        
                wizard_forms.Wizard4)                                                   
    form_list = super(Wizard, self).get_form_list()
    return form_list
我可能会清理一下,但这就是要点。前几行获取当前步骤并获取用于确定是否在此步骤之后插入另一步骤的标志。如果该标志为true,我们将获取表单中当前步骤的索引,向其中添加一个,然后在该索引处插入(在给定索引之前插入)。我们使用一个基于索引的键,这样无论该步骤重复多少次,我们都不会得到重叠的键。然后,我们将新步骤插入self.form\u列表,使其在实例范围内,调用self上的get\u form\u list(它具有新的self.form\u列表),并根据需要返回form\u列表

需要注意的一些事项:

  • 必须使用self.storage.current\u步骤而不是self.steps.current,因为后者会导致无限递归
  • 我们在初始化后使用self.form_list这一事实意味着,如果使用条件dict,事情可能会变得有点混乱。也就是说,它们很可能不会,因为条件dict为条件分配键,并且我们的form_list中没有任何键在更改,只有索引在更改

好了,就这样!显然,您需要在done()中添加一些逻辑,以确定如何保存其中的每一个,但这是特定于您正在执行的任何操作的。

我之前发布的答案非常不一致,我认为这是一些奇怪的会话冲突bug,但事实证明,这是因为get_form_list并不总是及时调用以执行需要表单的操作。我把同样的逻辑移到了下一步,现在它工作得很顺利

def get_next_step(self, step=None):
    if step is None:
        step = self.steps.current
    s_data = self.get_cleaned_data_for_step(step) or {}
    add_another = s_data.get('add_another', False)
    if add_another is True:
        index = self.form_list.keyOrder.index(step)+1
        key = "add-another-{0}".format(index)
        self.form_list.insert(index, key,
                wizard_forms.Wizard4)
    return super(Wizard, self).get_next_step(step)

结论是,这是不可能的。我还不太明白为什么它有时能与前两种解决方案一起工作,但在深入研究表单向导的代码之后,很明显每个请求都会重新初始化实例表单列表(从技术上讲,它是一个新实例),因此即使您更新存储中的列表,或者在get_form_list()中更新它,有些调用直接命中实例变量,而不是通过get_form_list()访问它,这需要进行一些主要的重构来调整


我为这个项目走了另一条路,但可能很快会尝试为此做点什么。

仍然不起作用…我没有注意到这条路的关键错误(他们稍后会出现),但它仍然不起作用,因为self.form\u list是一个实例变量,对基于类的视图的每个新请求都会创建一个新实例。因此,即使存储后端正在存储正确的新表单列表,在新(通常是POST)请求之后,每当类查看self.form\u列表时,它都找不到该步骤并抛出错误。