done
我正在尝试使用 FormWizard 在向导方法中提交订单“收费” 。扩展文档中的示例,执行信用卡“收费”done
意味着您无法返回并重新提示信用卡,因为向导在调用该方法self.storage.reset()
后执行。done
什么是正确的方法?确认表单clean()
步骤被多次调用以进行重新验证等,并且似乎从done()
所有经过验证的表单都可用的地方删除了。
感谢您的任何指示。
肯特
done
我正在尝试使用 FormWizard 在向导方法中提交订单“收费” 。扩展文档中的示例,执行信用卡“收费”done
意味着您无法返回并重新提示信用卡,因为向导在调用该方法self.storage.reset()
后执行。done
什么是正确的方法?确认表单clean()
步骤被多次调用以进行重新验证等,并且似乎从done()
所有经过验证的表单都可用的地方删除了。
感谢您的任何指示。
肯特
我可以想到这个:
done()
方法中,您将向用户收费。如果拒绝/失败,请将每个表单数据保存在会话/cookie 中。get_form_intial()
从会话/cookie 中返回数据以执行该步骤。但是,我认为验证可能会失败,因为跳过的步骤没有数据。所以你可能需要做更多的事情才能通过它。
我想答案是“你不能从这里到达那里”。我打开了一张票 #19189,但不清楚是否会添加此功能。
这是我的解决方案: 1. 扩展 WizardView,修改 render_done 方法以在其中捕获异常: -详细说明
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