5

我查看了 django 文档,进行了很多谷歌搜索,并尝试了很多不同的解决方案,但无济于事。

我使用 Django 的 FormWizard 创建了一个由 3 部分组成的表单。验证最后一个表单(支付表单)后,我会向支付网关发送支付请求。

我正在 FormWizard 的“process_step”方法中进行支付处理。

当付款失败时,我很难弄清楚如何让 FormWizard 再次显示付款页面。就像现在一样,FormWizard 的“完成”方法被调用(在我在 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/')
4

2 回答 2

6

我终于找到了解决方案。我在 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(),那么调整它会相当容易,但我个人认为 TheRightWay 是覆盖 render_done() 函数。

于 2012-09-03T19:41:53.047 回答
0

FormWizard 知道字段验证,但除此之外的任何事情,例如信用卡处理,都取决于您的视图(或其他地方)来捕捉和响应。

由于表单经过验证,并且您现在拥有用户输入的 POST,因此您视图中的每个异常/结果都可以呈现到页面(w/ RequestContext on),并添加您的错误消息。同样应该适用于forms.py。

于 2010-08-11T20:41:39.003 回答