我正在尝试使用formwizard在向导done
方法中提交订单"充电"。在文档中扩展示例,在done
中执行信用卡"充电"意味着您不能返回并重复信用卡,因为向导执行self.storage.reset()
致电done
方法。p>正确的方法是什么?确认表格clean()
步骤被称为多次重新验证,等等,&似乎也从所有验证表格可用的done()
中删除。
感谢您的任何指示。
肯特
我能想到的:
- 在
done()
方法中,您将向用户充电。如果拒绝/失败,请将每个表单数据保存在会话/cookie中。 - 从获取付款信息的特定步骤重新启动向导。名字urlwizard可能会有所帮助。
- 实现您的
get_form_intial()
以返回Session/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