0

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

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

感谢您的任何指示。

肯特

4

3 回答 3

0

我可以想到这个:

  • done()方法中,您将向用户收费。如果拒绝/失败,请将每个表单数据保存在会话/cookie 中。
  • 从获取付款信息​​的特定步骤重新启动向导。NamedUrlWizard可能会有所帮助。
  • 实现您get_form_intial()从会话/cookie 中返回数据以执行该步骤。

但是,我认为验证可能会失败,因为跳过的步骤没有数据。所以你可能需要做更多的事情才能通过它。

于 2012-10-23T04:52:17.447 回答
0

我想答案是“你不能从这里到达那里”。我打开了一张票 #19189,但不清楚是否会添加此功能。

于 2012-10-26T21:18:47.283 回答
0

这是我的解决方案: 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
于 2014-10-22T19:35:03.440 回答