【问题标题】:Restarting FormWizard from done method从 done 方法重新启动 FormWizard
【发布时间】:2023-03-17 18:35:01
【问题描述】:

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

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

感谢您的任何指点。

肯特

【问题讨论】:

  • 我理解这个问题,为了简单起见,假设您有三种形式。在表格二中,您正在收集信用卡信息。用户提交表单二后,您需要与您的支付处理商核对以确保用户提供的内容是有效的,如果不是,请重新显示带有错误的表单二。如果成功显示表格三?
  • 问题是即使付款信息“有效”,金额仍然可以“拒绝”。当通过done 中的所有验证表格时,我想创建订单模型实例和收费。但是在done 不能回到revalidate_form。只是似乎不是处理do something with the data 中错误的好方法。

标签: django django-formwizard


【解决方案1】:

我能想到这个:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是我的解决方案: 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多