Как / где остановить вызов метода «Выполнено» в Django Formwizards при сбое платежа - PullRequest
5 голосов
/ 12 августа 2010

Я просмотрел документацию по django, много гуглил и попробовал довольно много разных решений, но безрезультатно.

Я создал форму из 3 частей с помощью FormWizard Джанго. После проверки последней формы (формы оплаты) я отправляю запрос на оплату в платежный шлюз.

Я выполняю обработку платежа в методе 'process_step' FormWizard.

Мне трудно понять, как заставить FormWizard снова показывать страницу оплаты при сбое платежа. Как и сейчас, вызывается «готовый» метод FormWizard (после того, как я выполнил свою обработку в 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/')

Ответы [ 2 ]

6 голосов
/ 03 сентября 2012

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

0 голосов
/ 12 августа 2010

FormWizard знает о проверке поля, но все, что находится за его пределами, например, обработка кредитной карты, зависит от вас (или где-либо еще), чтобы вы могли его отследить и ответить.

Поскольку форма проверена, и теперь у вас есть POST ввода пользователя, каждое исключение / результат в вашем представлении может отображаться на странице (с параметром RequestContext on), а также добавлять к ней ваши сообщения об ошибках. То же самое относится и к forms.py.

...