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

     2023-02-24     221

关键词:

【中文标题】如何显示作为最终 django 表单向导步骤输入的所有数据的预览?【英文标题】:How can I show a preview of all data entered as a final django form wizard step? 【发布时间】:2013-02-01 11:23:16 【问题描述】:

我在 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() 来提供所有数据作为表单的初始字典。但是,正如我在评论中提到的,这导致 python 卡住了,我不得不手动查找并终止该进程以停止它。

所以现在我想我将重写 WizardView.get_context_data() 以向包含用户输入的所有数据的模板发送一个额外的上下文变量(同样,使用 get_all_cleaned_data())。但是,由于几个原因,这将有点复杂。由于我的任何模型中具有相同名称的任何字段都会相互影响,因此我必须返回并命名所有模型字段名称。这似乎是不必要的,但无论如何。此外,我的两个表单是 ModelFormSets,因此来自它们的数据以字典列表的形式出现。没什么大不了的,但它会使模板中的解析更加困难。这个问题越来越长,但查看数据可能会有所帮助,所以这里有一个 get_all_cleaned_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'',

所以,我的问题是,我是在正确的轨道上还是有更好的方法来做到这一点?例如,我是否可以使用 FormPreview 子类作为“预览”步骤的表单并将 FormPreview.done() 定义为

def done(self, request, cleaned_data):
    pass

这样数据就可以传递到 FormWizard 的最终处理机制(即 WizardView.done())?

【问题讨论】:

我想,如果我使用 get_cleaned_data_for_step 而不是 get_all_cleaned_data,我可以消除对模型字段名称进行命名空间的需要。我不知道用户填写了哪些表单,所以我必须全部检查它们或设置一个实例变量来跟踪每个表单是否已呈现。 【参考方案1】:

我只需覆盖 get_template_name 来处理要显示的模板(假设您有一个特殊的模板用于“预览”步骤)。

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

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

重载 get_form 让您可以在预览显示之前操作数据。

【讨论】:

只是为了确保我理解,您的提议将导致数据的只读视图,对吗?您只是重载 get_form 以操作数据,而不是实际创建包含前面步骤中的所有数据的可编辑表单,对吗?我不理解重载 get_form 的必要性。在我看来,我可以在 get_context_data 中以相同的方式操作数据。 重载 get_form 让您可以控制要使用的模板文件。我想您的最终步骤模板看起来与其他步骤有很大不同。 我正在为此使用 WizardView.get_template_names。

Django 表单向导 - 每个步骤的自定义表单布局

...置现在可以工作了,我可以为每个步骤调用不同的模板来显示可变文本。现在我想更进一步,为每个步骤创建自定义表单布局。Django的文档显示了一种显示表单的通用方式,总是垂直对齐 查看详情

Django:在表单向导中为步骤动态设置表单集

...间】:2014-03-1206:28:53【问题描述】:在我的Django视图中,作为FormWizard的一部分,我使用的是Formset。每个步骤的向导表单声明如下:UserFormSet=modelformset_factory(account_models.MyUse 查看详情

Django:如何让表单向导在创建表单时接收请求对象?

】Django:如何让表单向导在创建表单时接收请求对象?【英文标题】:Django:HowcanImakeFormWizardtakeinarequestobjectwhenitcreatestheforms?【发布时间】:2015-11-2412:37:33【问题描述】:我怎样才能做到,当Django的表单工具向导创建我的表单时... 查看详情

Django 表单向导,当我还没有完成时如何重置/清除向导?

】Django表单向导,当我还没有完成时如何重置/清除向导?【英文标题】:DjangoFormWizard,howtoreset/clearwizardwhenI\'mnotdoneyet?【发布时间】:2016-09-3016:13:43【问题描述】:我有一个有效的表单向导。要进入向导,用户将单击主页上的按... 查看详情

django:如何在表单向导中使用 inlineformset?

】django:如何在表单向导中使用inlineformset?【英文标题】:django:Howtouseinlineformsetwithintheformwizard?【发布时间】:2011-09-1518:02:16【问题描述】:我正在展示两个单独的示例项目。第一个是与联系人相关的,并显示了使用表单向导... 查看详情

django 向导,在同一步骤中使用表单和表单集

】django向导,在同一步骤中使用表单和表单集【英文标题】:djangowizard,usingformandformsetinthesamestep【发布时间】:2013-01-1615:37:09【问题描述】:我有一个场景,我正试图计划开始编码,我正在考虑使用djangowizard。我的计划是用两个... 查看详情

Django 表单向导,如何重置/清除向导?

】Django表单向导,如何重置/清除向导?【英文标题】:DjangoFormWizard,howtoreset/clearwizard?【发布时间】:2012-08-0914:30:26【问题描述】:我创建了一个运行良好的Django表单向导。但是,在完成向导并重新启动后,它会加载之前使用期... 查看详情

如何使用默认文件存储(S3)通过 Django FormTools 表单向导上传文件?

】如何使用默认文件存储(S3)通过DjangoFormTools表单向导上传文件?【英文标题】:HowcanIusetheDefaultFileStorage(S3)touploadfileswithDjangoFormToolsformwizard?【发布时间】:2017-11-3020:00:08【问题描述】:在上传文件时,django-formtools表单向导需... 查看详情

Django 表单向导独特的 URL 设计

...5步设置唯一的URL。基于此,我尝试设计URL,但我被困在如何将第一步保留为主页URL(mysite.com),其余部分类似于mysite.com/si 查看详情

在 django 中处理单个 html 表单的多个输入值

...入姓氏并按下按钮23rd步骤用户必须输入电子邮件并按下最终按钮3任何时候用户按下任何按钮然后转到下一个h 查看详情

如何在不使用表单向导验证表单的情况下转到上一步

】如何在不使用表单向导验证表单的情况下转到上一步【英文标题】:howtogotopreviousstepwithoutvalidatingtheformusingformwizard【发布时间】:2013-09-0122:11:47【问题描述】:我有一个使用django表单向导的sessionwizardview构建的多步骤表单,我... 查看详情

在 django 表单向导中使用不同的模板

】在django表单向导中使用不同的模板【英文标题】:Usingdifferenttemplateswithdjangoformwizard【发布时间】:2012-05-1610:55:28【问题描述】:我正在查看文档,但不太确定如何为每个步骤使用不同的模板...我查看了源代码,似乎模板名称... 查看详情

如何使不同的 Django 表单输入按钮显示在同一行

】如何使不同的Django表单输入按钮显示在同一行【英文标题】:HowtomakedifferentDjangoforminputbuttonsdisplayonsameline【发布时间】:2020-07-0308:30:12【问题描述】:我正在处理的页面上使用两个单独的Django表单,我希望输入按钮显示在同一... 查看详情

Django:如何在手动表单字段中显示模型的外键对象作为选择

】Django:如何在手动表单字段中显示模型的外键对象作为选择【英文标题】:Django:Howtodisplayforeignkeyobjectsofamodelinmanualformfieldaschoices【发布时间】:2020-05-1501:32:03【问题描述】:所以我有2个模型,称为Billing和Organization,如下所示... 查看详情

Django 向导表单中的条件表单字段

...尝试了一些与此相关的其他答案,但其中大多数都讲述了如何标记字段是否必填,但我只想在其他字段的答案为“是” 查看详情

使用 JSON 的 Django 导入向导

...多个模型。我希望能够:转到entries/import/之类的URL,它将显示一个文本字段我可以在其中粘贴一些JSON条目并点击提交然后我将进入向导的第2步,在该步骤中我将看到一个模型表单列表在检查/更改某些数据时, 查看详情

Django 表单向导调度程序

...图表来帮助说明:我正在使用django表单向导,但我不知道如何构建我的视图以合并这种类型的逻辑。有人可以帮我开始吗?最好展示一些需要在django-for 查看详情

步骤向导表单

】步骤向导表单【英文标题】:Stepwizardform【发布时间】:2019-04-1803:33:02【问题描述】:我正在使用角度动态形式制作角度应用程序,我需要将表单分成两部分。我在第一页输入字段firstnameandlastname,然后单击下一步按钮,需要... 查看详情