从完成方法重新启动formwizard



我正在尝试使用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

最新更新