Я наконец нашел решение.Я использую класс SessionWizardView в Django 1.4.
Я переопределил функцию 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 ().