wtforms raise a validation error after the form is validated

送分小仙女□ 提交于 2019-12-10 02:56:35

问题


I have a registration form that collects credit card info. The workflow is as follows:

  • User enters registration data and card data through stripe.
  • The form is validated for registration data.
  • If the form is valid, payment is processed.
  • If payment goes through, it's all good, the user is registered and moves on.
  • If the payment fails, i want to be able to raise a validation error on a hidden field of the form. Is that possible?

Here's a the form submission code:

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)

回答1:


I solved it by manually appending errors to the field i wanted.

It looks like that

try:

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



回答2:


on your wtform itself you can add a method prefixed with validate_ in order to raise an exception.

class RegistrationForm(Form):
  amount = IntegerField('amount', validators=[Required()])

  validate_unique_name(self, field):
    if field.data > 10000:
      raise ValidationError('too much money')

in my case I used it like so to validate that a user was not in the database already:

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")


来源:https://stackoverflow.com/questions/19831351/wtforms-raise-a-validation-error-after-the-form-is-validated

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!