2010-08-11 3 views
5

장고 문서를 살펴 보았습니다. 많은 검색 결과를 얻었지만 많은 해결책을 시도했지만 아무 소용이 없었습니다.Django Formwizards 'done'메소드를 중지하는 방법 결제 실패시 호출되는 방법

Django의 FormWizard를 사용하여 3 부분 양식을 만들었습니다. 마지막 양식 (지불 양식)이 확인되면 지불 게이트웨이로 지불 요청을 보냅니다.

FormWizard의 'process_step'메소드에서 지불 처리를하고 있습니다.

지불이 실패 할 때 FormWizard에 지불 페이지를 다시 표시하는 방법을 알아내는 데 어려움이 있습니다. 지금은 FormWizard의 'done'메소드가 호출됩니다 (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

폼이 FormWizard로 처리되는 방식에있어 근본적인 것이 빠져 있다고 생각합니다. 내가하고 싶은 것은 process_step의 단계 == 2에있는 주석과 같습니다 (테스트 코드에 표시된 것처럼). 거기에 넣을 코드를 모르겠습니다. 내가 무엇을 넣었는지에 관계없이 마지막 양식의 유효성이 검사되면 완료된 메서드가 실행 된 것으로 보입니다. 누군가가 지불 양식을 다시 표시하기 위해 사용할 수있는 코드 줄을 제공 할 수 있다면 (지불이 성공할 때까지 x 번 반복) 또는 render_template 또는 다른 곳에서 할 수있는 것을 제안하면 큰 도움이됩니다. – shawn

답변

6

마지막으로 해결책을 강타했습니다. 장고 1.4에서 SessionWizardView 클래스를 사용하고 있습니다.

은 내가 render_done() 함수 (장고/장고 /있는 contrib/formtools/마법사/views.py에서 직접 복사를 오버라이드하고 불통.

을 '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) 

내 마법사에 4 단계가 있고 배열이 제로이기 때문에 이것은 몇 군데에서 '3'으로 하드 코딩되어 있음을 알 수 있습니다. 표시 할 오류 메시지를 설정 한 다음 리디렉션합니다. process_step()을 사용하고 싶다면 이것을 적용하는 것이 매우 쉽 겠지만, 나는 개인적으로 TheRightWay가 render_done() 함수를 오버라이드한다고 생각합니다.

0

FormWizard가 외부 현장 검증 아무것도하지만, 알고는 (다른 나)보기 잡아에 대응하기에 달려있다.

유효성 검사가 완료되어 이제는 사용자 입력의 POST가 있으므로보기의 각 예외/결과는 페이지 (w/RequestContext)에 렌더링 할 수 있으며 오류 메시지도 추가 할 수 있습니다. forms.py도 마찬가지입니다.

+0

Hi Flowpoke, 응답 해 주셔서 감사합니다. 나는 아직도 이것에 대해 명확하지 않다. 나는 마지막 단계에서 결제가 실패 할 때 양식 마법사의 처리 방법을 잘 모릅니다. 추가 한 의견을 살펴보고 좀 더 자세하게 설명하거나 코드 줄을 제공하십시오. 그동안 나는 계속 일할 것입니다. 건배. – shawn