WTForms在表单验证后引发验证错误

11
我有一个收集信用卡信息的注册表格,工作流程如下:
  • 用户通过Stripe输入注册数据和信用卡数据。
  • 验证注册数据是否有效。
  • 如果表单有效,则进行付款处理。
  • 如果支付成功,则一切顺利,用户已注册并继续操作。
  • 如果付款失败,我希望能够在表单的隐藏字段上引发验证错误。这是可能的吗?

以下是表单提交代码:

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)
2个回答

30
我通过手动将错误附加到想要的字段来解决了它。
看起来是这样的。
try:

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

该解决方案对于 StripeError 对我有效,但我还在使用 Google 进行地理编码,然后尝试使用 form.field.errors.append('') 方法引发错误,但错误不会显示出来。 - Patrick Yan
问题在于添加错误并不会停止其余代码的执行(我在末尾有一个重定向)。我添加了额外的代码,以在重定向之前检查表单是否仍然存在错误。 - Patrick Yan
3
如果你得到了 "AttributeError: 'tuple' object has no attribute 'append'",请参考 https://dev59.com/S37aa4cB1Zd3GeqPp2ti#22889381 - Sam

2

在您的wtform本身上,您可以添加一个以validate_为前缀的方法来引发异常。

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

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

在我的案例中,我使用如下方式验证用户是否已经存在于数据库中:
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")

这种方法不容易出现竞态条件吗? - Nicolas L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接