2010-08-11 15 views
5

Ich habe durch die Django-Dokumentation, viel Googeln geschaut und habe einige verschiedene Lösungen ausprobiert, aber ohne Erfolg.Wie/wo zu stoppen Django Formwizards 'done' Methode wird bei Zahlungsausfall

Ich habe ein 3-teiliges Formular mit Django FormWizard erstellt. Sobald das letzte Formular (ein Zahlungsformular) bestätigt ist, sende ich eine Zahlungsanforderung an ein Zahlungs-Gateway.

Ich mache die Zahlungsverarbeitung in der Methode 'process_step' des FormWizard.

Ich habe Schwierigkeiten herauszufinden, wie der FormWizard die Zahlungsseite erneut anzeigen kann, wenn die Zahlung fehlschlägt. Wie es jetzt ist, wird die 'done'-Methode des FormWizard aufgerufen (nachdem ich meine Verarbeitung in process_step durchgeführt habe), da alle Formulare validiert wurden.

Ich frage mich, ob ich die Aufruf Methode überschreiben muss. Ich bin mir nicht sicher, wie das geht, aber ich versuche es gerade herauszufinden.

Jede Hilfe würde sehr geschätzt werden. Grüße, Shawn

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/') 
+0

Ich denke, ich vermisse etwas grundlegend in der Art, wie Formulare mit FormWizard verarbeitet werden. Was ich tun möchte, ist etwas wie die Kommentare in Step == 2 von process_step (wie im Testcode gezeigt). Ich bin mir nicht sicher, welchen Code ich dort eingeben soll. Egal was ich da hineinlege, die done-Methode scheint ausgeführt zu werden, da das letzte Formular validiert wurde. Wenn jemand eine Codezeile zur Verfügung stellen könnte, die dort arbeiten würde, um das Zahlungsformular erneut anzuzeigen (x Anzahl, bis die Zahlung erfolgreich ist), oder etwas vorschlagen, was ich in render_template oder anderswo tun könnte, wäre es eine große Hilfe. – shawn

Antwort

6

Ich habe endlich eine Lösung gefunden. Ich verwende die SessionWizardView-Klasse in Django 1.4.

overrode ich die render_done() Funktion (direkt aus django kopiert/django/contrib/formtools/Assistent/views.py und zwickte es.

Zwischen 'final_form_list.append (form_obj)' und der letzten drei Zeilen (beginnend mit 'done_response = self.done (final_form_list, ** kwargs)') Ich handle mit dem Payment-Gateway.

Wenn es einen Fehler gibt, ich umleiten zurück zum letzten Schritt im Formular (mit selbst .render.revalidation_failure()) und sie können es erneut versuchen.

Hier ist ein Codeschnipsel:

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) 

Sie werden feststellen, dass ich '3' an einigen Stellen fest codiert habe - dies liegt daran, dass mein Assistent vier Schritte hat und das Array auf Null basiert. Ich habe die Fehlermeldung angezeigt und dann umgeleitet. Ich bin sicher, es wäre ziemlich einfach, das anzupassen, wenn Sie bei process_step() bleiben wollten, aber ich persönlich denke, dass TheRightWay die Funktion render_done() überschreiben soll.

0

Der FormWizard ist sich dessen bewusst Feldvalidierung aber etwas außerhalb, dass, wie die Verarbeitung von Kreditkarte ist bis zu Ihrer Ansicht (oder anderswo) zu fangen und darauf zu reagieren.

Da das Formular validiert wurde und Sie nun einen POST der Benutzereingabe haben, kann jede Ausnahme/jedes Ergebnis in Ihrer Ansicht auf die Seite gerendert werden (mit RequestContext) und auch Ihre Fehlermeldungen hinzufügen. Gleiches sollte für forms.py gelten.

+0

Hallo Flowpoke, danke für die Antwort. Ich bin mir immer noch nicht ganz sicher. Ich bin mir nicht sicher, wie ich bei der Verarbeitung des Formularassistenten bleiben kann, wenn die Zahlung im letzten Schritt fehlschlägt. Könnten Sie sich die zusätzlichen Kommentare, die ich hinzugefügt habe, ansehen und möglicherweise ein bisschen mehr Details oder eine Codezeile bereitstellen, um Ihnen zu helfen? In der Zwischenzeit werde ich weiter daran arbeiten. Prost. – shawn