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/') 
+0

我想我在FormWizard处理窗体的方式中缺少一些基本的东西。 我想要做的就像process_step的步骤== 2中的注释(如测试代码所示)。只是不确定代码放在那里。 无论我在那里放置什么,完成的方法似乎在最后一个表单被验证时执行。 如果任何人都可以提供一行代码来再次显示付款表单(x次,直到付款成功),或者建议我可以在render_template或其他地方执行的操作,这将非常有帮助。 – shawn 2010-08-12 09:20:37

我终于遇到了一个解决方案。我在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。

+0

嗨Flowpoke,谢谢你的回应。我仍然不清楚这一点。当最后一步付款失败时,我不确定如何保持表单向导的处理。你能否看看我已经添加的其他评论,并可能提供更多的细节或一行代码来帮助你。与此同时,我会继续努力。干杯。 – shawn 2010-08-12 09:23:39