我浏览了 django 文档,进行了大量的谷歌搜索,并尝试了很多不同的解决方案,但没有成功。
我使用 Django 的 FormWizard 创建了一个由 3 部分组成的表单。最后一个表单(付款表单)经过验证后,我会向支付网关发送付款请求。
我正在 FormWizard 的“process_step”方法中进行付款处理。
我很难弄清楚如何让 FormWizard 在付款失败时再次显示付款页面。现在,FormWizard 的“done”方法被调用(在 process_step 中完成处理之后),因为所有表单都已被验证。
我想知道是否需要重写 call 方法。不太确定如何做到这一点,但我目前正在尝试解决这个问题。
任何帮助将不胜感激。 问候, 肖恩
class TrainingWizard(FormWizard):
def process_step(self,request,form,step):
if step == 0:
self.extra_context = {'stepOne': "One"}
if step == 1:
self.extra_context = {'stepTwo': "Two"}
if step == 2:
if self.get_response != "Success":
#Payment Failed
#Add error message
#Show Payment Form Again to allow user to retry
return
def get_response(self):
#return "Success"
return "Declined"
def done(self, request, form_list):
return HttpResponseRedirect('/training-registration-complete/')
最佳答案
我终于想到了一个解决方案。我在 Django 1.4 中使用 SessionWizardView 类。
我覆盖了 render_done() 函数(直接从 django/django/contrib/formtools/wizard/views.py 中复制它并对其进行了调整。
在“final_form_list.append(form_obj)”和最后三行(以“done_response = self.done(final_form_list, **kwargs)”开头)之间,我处理与支付网关的通信。
如果出现错误,我会重定向回表单中的最后一步(使用 self.render.revalidation_failure()),他们可以重试。
这是一段代码:
try:
charge = stripe.Charge.create(
amount=price_in_cents,
currency="usd",
card=token,
description="BlahStore Order Number: %s" %(self.order.pk),
)
except (stripe.APIConnectionError, stripe.APIError, stripe.AuthenticationError, stripe.CardError, stripe.InvalidRequestError, stripe.StripeError) as e:
from django.forms import forms
from django.forms.util import ErrorList
errors = final_form_list[3]._errors.setdefault(forms.NON_FIELD_ERRORS, ErrorList())
errors.append(e.message)
return self.render_revalidation_failure(3, final_form_list[3], **kwargs)
您会注意到我在几个地方硬编码了“3”——这是因为我的向导有四个步骤,并且数组是从零开始的。我将错误消息设置为显示然后重定向。我确信如果您想坚持使用 process_step(),那么调整它会相当容易,但我个人认为正确的方法是重写 render_done() 函数。
关于django - 如何/在哪里停止支付失败时调用 Django Formwizards 'done' 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3462332/