Django Formwizards'done'方法在支付失败时被调用的方式
我已经浏览了django文档,做了大量的Google搜索,并尝试了很多不同的解决方案,但无济于事。Django Formwizards'done'方法在支付失败时被调用的方式
我已经使用Django的FormWizard创建了3部分窗体。一旦最后一张表格(付款表格)得到验证,我就向支付网关发送付款请求。
我正在FormWizard的'process_step'方法中进行支付处理。
我很难弄清楚如何让FormWizard在付款失败时再次显示付款页面。就像现在一样,FormWizard的'done'方法被调用(在我完成了process_step中的处理之后),因为所有的表单都已经过验证。
我想知道是否需要重写调用方法。不太确定如何做到这一点,但我目前正试图弄清楚。
任何帮助将不胜感激。 问候, 肖恩
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 /向导/ views.py的和调整它。
之间 'final_form_list.append(form_obj)' 和最后三行(以'done_response = self.done(final_form_list,** kwargs)'开头)我处理与支付网关的通话
如果出现错误,我将重定向回表单中的最后一步.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(),我相信这将很容易适应,但我个人认为TheRightWay是重写render_done()函数。
的FormWizard知道现场验证,但任何事情之外的,如信用卡处理达到您的视图(或其他地方)来捕捉和回应。
由于表单已通过验证,并且您现在拥有用户输入的POST,所以视图中的每个异常/结果都可以呈现给页面(带有RequestContext),并且还会向其添加错误消息。这同样适用于forms.py。
嗨Flowpoke,谢谢你的回应。我仍然不清楚这一点。当最后一步付款失败时,我不确定如何保持表单向导的处理。你能否看看我已经添加的其他评论,并可能提供更多的细节或一行代码来帮助你。与此同时,我会继续努力。干杯。 – shawn 2010-08-12 09:23:39
我想我在FormWizard处理窗体的方式中缺少一些基本的东西。 我想要做的就像process_step的步骤== 2中的注释(如测试代码所示)。只是不确定代码放在那里。 无论我在那里放置什么,完成的方法似乎在最后一个表单被验证时执行。 如果任何人都可以提供一行代码来再次显示付款表单(x次,直到付款成功),或者建议我可以在render_template或其他地方执行的操作,这将非常有帮助。 – shawn 2010-08-12 09:20:37