5

私は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/')
4

2 に答える 2

6

私は最終的に解決策を見つけました。Django 1.4 で SessionWizardView クラスを使用しています。

render_done() 関数をオーバーライドしました (django/django/contrib/formtools/wizard/views.py から直接コピーして微調整しました。

「final_form_list.append(form_obj)」と最後の 3 行 (「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' がハードコーディングされていることに気付くでしょう。これは、ウィザードに 4 つのステップがあり、配列がゼロベースであるためです。エラーメッセージを表示してからリダイレクトするように設定しました。process_step() に固執したい場合、これを適応させるのはかなり簡単だと確信していますが、個人的には TheRightWay は render_done() 関数をオーバーライドすることだと思います。

于 2012-09-03T19:41:53.047 に答える
0

FormWizard はフィールドの検証を認識していますが、クレジット カードの処理など、それ以外のものは、キャッチして応答するビュー (または他の場所) 次第です。

フォームが検証され、ユーザー入力の POST が作成されたので、ビュー内の各例外/結果をページにレンダリングし (RequestContext をオンにして)、エラー メッセージを追加することもできます。同じことが forms.py にも当てはまります。

于 2010-08-11T20:41:39.003 に答える