gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:23:32 25 4
gpt4 key购买 nike

我正在使用 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())。然而,由于几个原因,这会有点复杂。由于我的任何模型中具有相同名称的任何字段都会相互遮盖,因此我必须返回并命名所有模型字段名称。这似乎没有必要,但无论如何。另外,我的两个表单是 ModelFormSet,因此它们的数据以字典列表的形式出现。没什么大不了的,但它会使模板中的解析变得更加困难。这个问题越来越长,但查看数据可能会有所帮助,因此这里是 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_template_name 来处理要显示的模板(假设您有一个用于“预览”步骤的特殊模板)。

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

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

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

关于django - 如何显示作为最终 django 表单向导步骤输入的所有数据的预览?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com