2010-08-11 17 views
5

पर Django Formwizards 'done' विधि को कैसे/कहां रोकना है, मैंने django दस्तावेज को देखा है, बहुत सारे गुगलिंग किए हैं और कुछ अलग समाधानों का प्रयास किया है लेकिन इसका कोई फायदा नहीं हुआ है।भुगतान विफलता

मैंने Django के फॉर्म विज़ार्ड का उपयोग करके 3 भाग फ़ॉर्म बनाया है। एक बार अंतिम फॉर्म (भुगतान फ़ॉर्म) मान्य हो जाने पर, मैं भुगतान गेटवे पर भुगतान अनुरोध भेजता हूं।

मैं फॉर्मवार्डर की 'process_step' विधि में भुगतान प्रक्रिया कर रहा हूं।

मुझे यह पता लगाने में कठिनाई हो रही है कि भुगतान विफल होने पर फॉर्म विज़ार्ड फिर से भुगतान पृष्ठ कैसे दिखा सकता है। जैसा कि अब है, फॉर्म विज़ार्ड की 'पूर्ण' विधि को कॉल किया जाता है (जब मैंने प्रक्रिया_स्टेप में अपनी प्रसंस्करण की है), क्योंकि सभी रूपों को सत्यापित किया गया है।

मुझे आश्चर्य है कि मुझे कॉल विधि को ओवरराइड करने की आवश्यकता है। वास्तव में यह सुनिश्चित नहीं है कि यह कैसे करें, लेकिन मैं वर्तमान में इसे समझने की कोशिश कर रहा हूं।

किसी भी मदद की बहुत सराहना की जाएगी। जैसे क्रेडिट कार्ड प्रसंस्करण के रूप में सादर, शॉन

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

मुझे लगता है कि फॉर्म फॉर्मवार्ड के साथ फ़ॉर्म को संसाधित करने के तरीके में कुछ मौलिक याद आ रही है। मैं क्या करना चाहता हूं प्रक्रिया_step के चरण == 2 में टिप्पणियों की तरह कुछ है (जैसा कि परीक्षण कोड में दिखाया गया है)। बस यह सुनिश्चित न करें कि वहां कौन सा कोड डालना है। कोई फर्क नहीं पड़ता कि मैंने वहां क्या रखा है, पिछली विधि को अंतिम रूप के रूप में निष्पादित किया गया है। यदि कोई भी कोड की एक पंक्ति प्रदान कर सकता है जो भुगतान फॉर्म को फिर से दिखाने के लिए वहां काम करेगा (भुगतान की सफलता तक x बार बार), या कुछ ऐसा सुझाव दें जो मैं render_template या अन्य जगहों में कर सकता हूं, तो यह एक बड़ी मदद होगी। – shawn

उत्तर

6

अंत में मैंने एक समाधान पर मारा। मैं Django 1.4 में सत्र विज़ार्ड व्यू क्लास का उपयोग कर रहा हूं।

मैं render_done() फ़ंक्शन (यह सीधे Django/Django/योगदान/formtools/जादूगर/views.py से बाहर की नकल की overrode और यह बदलाव किया।

बीच 'final_form_list.append (form_obj)' और पिछले तीन लाइनें ('done_response = self.done (final_form_list, ** kwargs) से शुरू होती हैं) मैं भुगतान गेटवे से बात कर रहा हूं।

यदि कोई त्रुटि है, तो मैं फ़ॉर्म में अंतिम चरण पर वापस रीडायरेक्ट करता हूं (स्वयं का उपयोग करके .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

FormWizard क्षेत्र सत्यापन लेकिन, कि बाहर कुछ भी के बारे में पता है पकड़ने और के लिए प्रतिक्रिया करने (कहीं और या) आपके विचार पर निर्भर है।

फॉर्म के सत्यापन के बाद से, और अब आपके पास उपयोगकर्ताओं के इनपुट का एक पोस्ट है, तो आपके दृश्य में प्रत्येक अपवाद/परिणाम पृष्ठ (w/requestContext चालू) पर प्रस्तुत कर सकता है और इसमें आपके त्रुटि संदेश भी जोड़ सकते हैं। Form.py पर लागू होना चाहिए।

+0

हाय फ्लोपाक, प्रतिक्रिया के लिए धन्यवाद। मैं अभी भी इस पर बिल्कुल स्पष्ट नहीं हूँ। मुझे यकीन नहीं है कि अंतिम चरण पर भुगतान विफल होने पर फ़ॉर्म विज़ार्ड की प्रसंस्करण में कैसे रहना है। क्या आप अतिरिक्त टिप्पणियों को देख सकते हैं जो मैंने जोड़ा है और संभवतः थोड़ा अधिक विस्तार, या मदद करने के लिए कोड की एक पंक्ति प्रदान करते हैं। इस बीच, मैं इस पर काम करना जारी रखूंगा। चीयर्स। – shawn

संबंधित मुद्दे