django - 如何/在哪里停止支付失败时调用 Django Formwizards 'done' 方法

标签 django validation call formwizard

我浏览了 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/

相关文章:

python - SQLAlchemy 中的信号或触发器

python - 在 Django App 中显示州、县、市

Angular 表单电子邮件验证器未按预期工作

javascript - IE8 slice 调用问题 - Array.prototype.slice - 'this' 不是 Javascript 对象

c - 关于C中函数参数的静态值

python - 管理员中的 Django-tinymce 功能齐全

python - MonkeyPatch警告: Monkey-patching ssl after ssl has already been imported may lead to errors

html - 即使 html 文件没有错误,标记验证也没有显示绿色横幅

regex - 电子邮件验证 - @ 之前和点之前的字符长度

ASP.NET 从用户控件 (ASCX) 调用 (ASPX) 中的方法?