2010-08-11 13 views
5

Tôi đã xem qua tài liệu django, thực hiện rất nhiều googling và đã thử khá một vài giải pháp khác nhau nhưng vô ích.Làm thế nào/nơi dừng phương thức Django Formwizards 'done' được gọi là thất bại thanh toán

Tôi đã tạo biểu mẫu 3 phần bằng FormWizard của Django. Khi biểu mẫu cuối cùng (biểu mẫu thanh toán) được xác thực, tôi sẽ gửi yêu cầu thanh toán đến cổng thanh toán.

Tôi đang xử lý thanh toán trong phương thức 'process_step' của FormWizard.

Tôi đang gặp khó khăn trong việc tìm ra cách để FormWizard hiển thị lại trang thanh toán khi thanh toán không thành công. Như bây giờ, phương thức 'done' của FormWizard được gọi (sau khi tôi đã xử lý xong trong process_step), vì tất cả các biểu mẫu đã được xác nhận hợp lệ.

Tôi tự hỏi liệu mình có cần ghi đè phương thức gọi hay không. Không thực sự chắc chắn làm thế nào để làm điều đó, nhưng tôi hiện đang cố gắng tìm ra điều đó.

Mọi trợ giúp sẽ được đánh giá cao. Kính trọng, 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

Tôi nghĩ rằng tôi đang thiếu thứ gì đó cơ bản trong cách Biểu mẫu được xử lý bằng FormWizard. Những gì tôi muốn làm là một cái gì đó giống như các ý kiến ​​trong bước == 2 của process_step (như được hiển thị trong mã kiểm tra). Chỉ cần không chắc chắn những gì mã để đặt ở đó. Không có vấn đề gì tôi đặt trong đó, phương pháp thực hiện dường như được thực hiện như hình thức cuối cùng đã được xác nhận. Nếu bất cứ ai có thể cung cấp một dòng mã sẽ hoạt động ở đó để hiển thị lại biểu mẫu thanh toán (x số lần cho đến khi thanh toán thành công) hoặc đề xuất điều gì đó tôi có thể thực hiện trong render_template hoặc ở nơi khác, đó sẽ là một trợ giúp tuyệt vời. – shawn

Trả lời

6

Cuối cùng tôi đã đạt được giải pháp. Tôi đang sử dụng lớp SessionWizardView trong Django 1.4.

Tôi overrode các render_done() chức năng (sao chép trực tiếp ra khỏi django/django/contrib/formtools/wizard/views.py và tinh chỉnh nó.

giữa 'final_form_list.append (form_obj) và cuối cùng ba dòng (bắt đầu bằng 'done_response = self.done (final_form_list, ** kwargs)') Tôi xử lý nói chuyện với cổng thanh toán.

Nếu có lỗi, tôi chuyển hướng đến bước cuối cùng trong biểu mẫu (tự sử dụng .render.revalidation_failure()) và họ có thể thử lại.

Đây là đoạn mã:

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) 

Bạn sẽ nhận thấy tôi đã mã hóa cứng '3' ở một vài nơi - điều này là do thuật sĩ của tôi có bốn bước và mảng không dựa. Tôi đặt thông báo lỗi hiển thị rồi chuyển hướng. Tôi chắc chắn nó sẽ khá dễ dàng để thích ứng với điều này nếu bạn muốn gắn bó với process_step(), nhưng cá nhân tôi nghĩ TheRightWay là ghi đè lên hàm render_done().

0

Các FormWizard nhận thức được xác nhận lĩnh vực nhưng bất cứ điều gì ngoài đó, chẳng hạn như xử lý thẻ tín dụng lên đến tầm nhìn của bạn (hoặc nơi khác) để bắt và đáp ứng.

Kể từ khi biểu mẫu được xác thực và bây giờ bạn có POST đầu vào của người dùng, mỗi ngoại lệ/kết quả trong chế độ xem của bạn có thể hiển thị trên trang (w/RequestContext) và cũng thêm vào đó thông báo lỗi của bạn. Tương tự nên áp dụng cho forms.py.

+0

Hi Flowpoke, cảm ơn phản hồi. Tôi vẫn chưa rõ về điều này. Tôi không chắc chắn làm thế nào để ở trong quá trình xử lý của biểu mẫu khi thanh toán không thành công ở bước cuối cùng. Bạn có thể xem xét các nhận xét bổ sung mà tôi đã thêm và có thể cung cấp chi tiết hơn một chút hay một dòng mã để trợ giúp. Trong thời gian chờ đợi, tôi sẽ tiếp tục làm việc. Chúc mừng. – shawn