2010-08-11 6 views
5

He revisado la documentación de django, he hecho muchas búsquedas en Google y he intentado con bastantes soluciones diferentes pero fue en vano.Cómo/dónde detener el método 'hecho' de Django Formwizards que se invoca en la falla de pago

He creado un formulario de 3 partes utilizando FormWizard de Django. Una vez que se valida el último formulario (un formulario de pago), envío una solicitud de pago a una pasarela de pago.

Estoy haciendo el procesamiento de pagos en el método 'process_step' de FormWizard.

Tengo dificultades para descubrir cómo mostrar FormWizard la página de pago nuevamente cuando falla el pago. Tal como está ahora, se llama al método 'hecho' de FormWizard (después de que he hecho mi procesamiento en process_step), ya que todos los formularios han sido validados.

Me pregunto si necesito anular el método de llamada. No estoy muy seguro de cómo hacerlo, pero actualmente estoy tratando de resolverlo.

Cualquier ayuda sería muy apreciada. Saludos, 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

Creo que me falta algo fundamental en la forma en que se procesan los formularios con FormWizard. Lo que quiero hacer es algo así como los comentarios en el paso == 2 de process_step (como se muestra en el código de prueba). Simplemente no estoy seguro de qué código poner allí. No importa lo que ponga ahí, el método hecho parece ser ejecutado ya que el último formulario ha sido validado. Si alguien pudiera proporcionar una línea de código que funcionaría allí para mostrar el formulario de pago nuevamente (x número de veces hasta que el pago tenga éxito), o sugerir algo que podría hacer en render_template o en otro lugar, sería de gran ayuda. – shawn

Respuesta

6

Finalmente encontré una solución. Estoy usando la clase SessionWizardView en Django 1.4.

que pesaban más que las render_done() función (copiado directamente de Django/django/contrib/formtools/asistente/views.py y ajustado ella.

Entre 'final_form_list.append (form_obj)' y el último tres líneas (comenzando con 'done_response = self.done (final_form_list, ** kwargs)') Manejo de hablar con la pasarela de pago.

Si hay un error, lo redirecciono al último paso del formulario (usando self .render.revalidation_failure()) y pueden intentarlo de nuevo.

Aquí hay un fragmento de código:

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) 

Notarás que tengo '3' codificado en algunos lugares, esto es porque mi asistente tiene cuatro pasos y la matriz está basada en cero. Configuro el mensaje de error para mostrar y luego redireccionar. Estoy seguro de que sería bastante fácil adaptar esto si quisieras seguir con process_step(), pero personalmente creo que TheRightWay debe anular la función render_done().

0

El FormWizard es consciente de validación de campo, pero nada fuera de eso, tales como procesamiento de tarjetas de crédito depende de su punto de vista (o en otro lugar) para capturar y responder a.

Dado que el formulario está validado, y ahora tiene una POST de la entrada de los usuarios, cada excepción/resultado en su vista puede mostrarse en la página (con RequestContext activado) y también agregar sus mensajes de error. Lo mismo debe aplicarse a forms.py.

+0

Hola Flowpoke, gracias por la respuesta. Todavía no estoy del todo claro en esto. No estoy seguro de cómo permanecer dentro del proceso del asistente del formulario cuando el pago falla en el último paso. ¿Podría echar un vistazo a los comentarios adicionales que he agregado y, posiblemente, proporcionar un poco más de detalle, o una línea de código para ayudar. Mientras tanto, seguiré trabajando en eso. Aclamaciones. – shawn

Cuestiones relacionadas