从done方法重新启动FormWizard

时间:2012-10-22 21:48:42

标签: django django-formwizard

我正在尝试使用FormWizard在向导done方法中提交订单“费用”。扩展文档中的示例,在done中执行信用卡“收费”意味着您无法返回并重新提取信用卡,因为向导在后执行self.storage.reset() >调用done方法。

什么是正确的方法?确认表单clean()步骤被多次调用以进行重新验证等,&似乎已从done()中删除了所有经过验证的表单。

感谢您的任何指示。

肯特

3 个答案:

答案 0 :(得分:0)

我能想到这个:

  • done()方法中,您将向用户收费。如果拒绝/失败,请将每个表单数据保存在session / cookies中。
  • 从执行付款信息的特定步骤重新启动向导。 NamedUrlWizard可能会有帮助。
  • 实施您的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