Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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表单向导最后一步输入的所有数据的预览?_Django_Django Forms_Django Formwizard - Fatal编程技术网

如何显示作为django表单向导最后一步输入的所有数据的预览?

如何显示作为django表单向导最后一步输入的所有数据的预览?,django,django-forms,django-formwizard,Django,Django Forms,Django Formwizard,我正在使用django 1.4中的表单向导有条件地添加多达七个模型的实例。无论用户完成哪些步骤,我希望最后一步显示他们输入的所有数据的预览。它不必是一个表单,因为用户可以使用“第一步”或“上一步”按钮返回并修复他们弄乱的任何数据。我还想向用户发送一封确认电子邮件,其中包含他们的所有数据,我怀疑我在这里提出的任何解决方案都会提供相关数据 以下是我目前拥有的: # views.py FORMS = [ ('person_application', PersonApplicationForm

我正在使用django 1.4中的表单向导有条件地添加多达七个模型的实例。无论用户完成哪些步骤,我希望最后一步显示他们输入的所有数据的预览。它不必是一个表单,因为用户可以使用“第一步”或“上一步”按钮返回并修复他们弄乱的任何数据。我还想向用户发送一封确认电子邮件,其中包含他们的所有数据,我怀疑我在这里提出的任何解决方案都会提供相关数据

以下是我目前拥有的:

# views.py
FORMS = [
    ('person_application',  PersonApplicationForm),
    ('family_application',  FamilyApplicationForm),
    ('student_application', StudentApplicationForm),
    ('spouse',              SpouseForm),
    ('child',               ChildFormSet),
    ('roommate',            RoommateFormSet),
    ('preview',             Form), # only doing this because I think FormWizard requires a Form subclass for every step, which makes sense
]

TEMPLATES = {
    ...
    'preview':              'preview.html',
}

condition_dict = {
    ...
    'preview': True,
}

class SignupWizard(SessionWizardView):
    ...

    def get_context_data(self, form, **kwargs):
        context = super(SignupWizard, self).get_context_data(form=form, **kwargs)
        if self.steps.current == 'preview':
            context.update({'all_data': self.get_all_cleaned_data()})
        return context

    # # This is triggering an infinite loop or something because python gets stuck at 100+% cpu and won't stop even when I kill runserver
    # def get_form_initial(self, step):
    #     if step == 'preview':
    #         return self.get_all_cleaned_data()
    #     return {}

    ...

# urls.py
urlpatterns = patterns('app.views',
    ...
    url(r'^start$', SignupWizard.as_view(FORMS, condition_dict=condition_dict, instance_dict=modelform_instances), name='wizard'),
    url(r'^thanks$', 'thanks', name='thanks'),
)
正如您所看到的,在某个时候,我认为我应该尝试实际使用表单进行预览,因此我尝试覆盖WizardView.get_Form_initial。我想使用WizardView.get_all_cleaned_data()将所有数据作为表单的初始dict提供。但是,正如我在评论中提到的,这导致python陷入困境,我不得不手动查找并终止进程以停止它

因此,现在我想我将重写WizardView.get_context_data()以向包含用户输入的所有数据的模板发送一个额外的上下文变量(同样,使用get_all_data())。然而,由于几个原因,这将有点复杂。由于我的任何模型中具有相同名称的任何字段都将相互隐藏,因此我必须返回并命名所有模型字段名称的名称空间。这似乎不必要,但无论如何。另外,我的两个表单是modelformset,因此来自它们的数据是一个字典列表。没什么大不了的,但这会使模板中的解析更加困难。这个问题越来越长,但查看数据可能会有所帮助,因此下面是一个示例,说明get_all_cleaned_data()当前返回的内容(发送到模板时):


因此,数据只需传递到FormWizard的最终处理机制(即WizardView.done())?

我只需覆盖
get\u template\u name
来处理要显示的模板(假设“预览”步骤有一个特殊的模板)

然后我重载
get_form
,将每个步骤的数据附加到一个实例变量

最后,我要重载
get_context_data
,以便始终将该实例变量附加到我的模板上下文中


重载get_form允许您在显示预览之前操作数据。

为了确保我理解,您的建议将导致数据的只读视图,对吗?您只是重载get_form以操作数据,而不是使用前面步骤中的所有数据实际创建一个可编辑表单,对吗?我不理解让表单过载的必要性。在我看来,我可以在get\u context\u data中以相同的方式操作数据。重载get\u form可以让您控制要使用的模板文件。我想您的最终步骤模板与其他步骤会有很大的不同。我正在使用WizardView.get_template_Name来实现这一点。我想,如果我在步骤中使用get_cleaned_data_,而不是get_all_cleaned_data_data_,我就不需要为模型字段名命名了。我不知道用户填写了哪些表单,所以我必须全部检查它们,或者设置一个实例变量来跟踪是否显示了每个表单。
{'all_data': {'birthdate': datetime.date(1940, 2, 5),
              'building_pref_1': u'NGH4',
              'building_pref_2': u'K2',
              'city': u'Nashville',
              'country': u'',
              'email': u'johnny@cash.com',
              'first_name': u'Johnny',
              u'formset-child': [{'birthdate': datetime.date(2013, 2, 3),
                                  'gender': u'F',
                                  'id': None,
                                  'name': u'Rosanne'},
                                 {'birthdate': datetime.date(2013, 2, 1),
                                  'gender': u'F',
                                  'id': None,
                                  'name': u'Cathy'},
                                 {'birthdate': datetime.date(2013, 2, 5),
                                  'gender': u'F',
                                  'id': None,
                                  'name': u'Cindy'},
                                 {'birthdate': datetime.date(2013, 2, 2),
                                  'gender': u'F',
                                  'id': None,
                                  'name': u'Tara'},
                                 {},
                                 {}],
              'furnishing': u'F',
              'gender': u'F',
              'global_id': u'',
              'last_name': u'Cash',
              'living_situation': u'SC',
              'middle_initial': u'',
              'move_in_date': None,
              'move_out_date': None,
              'name': u'Vivian Liberto',
              'phone': u'9891111111',
              'smoker_status': u'True',
              'state_province': u'TN',
              'street_1': u'street',
              'street_2': u'',
              'student_number': None,
              'term': <Term: Summer 2013>,
              'type': u'F',
              'university_status': u'O',
              'university_status_other': u'Travelling musician',
              'zip_code': u''},
def done(self, request, cleaned_data):
    pass