我正在尝试使用FormWizard在向导done
方法中提交订单“费用”。扩展文档中的示例,在done
中执行信用卡“收费”意味着您无法返回并重新提取信用卡,因为向导在后执行self.storage.reset()
>调用done
方法。
什么是正确的方法?确认表单clean()
步骤被多次调用以进行重新验证等,&似乎已从done()
中删除了所有经过验证的表单。
感谢您的任何指示。
肯特
答案 0 :(得分:0)
我能想到这个:
done()
方法中,您将向用户收费。如果拒绝/失败,请将每个表单数据保存在session / cookies中。get_form_intial()
以从会话/ Cookie中返回该步骤的数据。但是,我认为对此的验证可能会失败,因为跳过的步骤没有数据。所以你可能需要做更多的事情才能通过它。
答案 1 :(得分:0)
我想答案是“你不能从这里到达那里”。我开了一张19189号的票,但目前还不清楚这个功能是否会被添加。
答案 2 :(得分:0)
这是我的解决方案: 1.扩展WizardView,修改render_done方法以捕获其中的异常: - detailed description
from django.contrib.formtools.wizard.views import SessionWizardView
class MySessionWizardView(SessionWizardView):
def __init__(self, **kwargs):
super(MySessionWizardView, self).__init__(**kwargs)
self.has_errors = False
class RevalidationError(Exception):
def __init__(self, step, form, **kwargs):
self.step = step
self.form = form
self.kwargs = kwargs
def __repr__(self):
return '%s(%s)' % (self.__class__, self.step)
__str__ = __repr__
def render_done(self, form, **kwargs):
final_form_list = []
for form_key in self.get_form_list():
form_obj = self.get_form(step=form_key,
data=self.storage.get_step_data(form_key),
files=self.storage.get_step_files(form_key))
if not form_obj.is_valid():
return self.render_revalidation_failure(form_key, form_obj, **kwargs)
final_form_list.append(form_obj)
try:
done_response = super(MySessionWizardView, self).render_done(form, **kwargs)
except self.RevalidationError as e:
return self.render_revalidation_failure(e.step, e.form, **e.kwargs)
self.storage.reset()
return done_response