wtforms genera un error de validación después de validar el formulario

Tengo un formulario de registro que recoge la información de la tarjeta de crédito. El flujo de trabajo es el siguiente:

  • El usuario ingresa los datos de registro y los datos de la tarjeta a través de la banda.
  • El formulario está validado para los datos de registro.
  • Si el formulario es válido, se procesa el pago.
  • Si el pago se realiza, todo está bien, el usuario está registrado y continúa.
  • Si el pago falla, quiero poder generar un error de validación en un campo oculto del formulario. ¿Es eso posible?

Aquí está el código de envío del formulario:

def register(): form = RegistrationForm() if form.validate_on_submit(): user = User( [...] ) db.session.add(user) #Charge amount = 10000 customer = stripe.Customer.create( email=job.company_email, card=request.form['stripeToken'] ) try: charge = stripe.Charge.create( customer=customer.id, amount=amount, currency='usd', description='Registration payment' ) except StripeError as e: ***I want to raise a form validation error here if possible.*** db.session.commit() return redirect(url_for('home')) return render_template('register.html', form=form) 

Lo resolví agregando errores manualmente al campo que quería.

Se parece a eso

 try: [...] except StripeError as e: form.payment.errors.append('the error message') else: db.session.commit() return redirect(url_for('home')) 

en su propio formulario puede agregar un método con el prefijo validate_ para generar una excepción.

 class RegistrationForm(Form): amount = IntegerField('amount', validators=[Required()]) validate_unique_name(self, field): if field.data > 10000: raise ValidationError('too much money') 

en mi caso, lo usé para validar que un usuario no estaba en la base de datos ya:

 class Registration(Form): email = StringField('Email', validators=[Required(), Email()]) # field for email # ... def validate_email(self, field): # here is where the magic is if User.query.filter_by(email=field.data).first(): # check if in database raise ValidationError("you're already registered")