2013-11-07 2 views
7

У меня есть регистрационная форма, которая собирает информацию о кредитной карте. Рабочий процесс выглядит следующим образом:wtforms повысить достоверность проверки после того, как форма подтверждена

  • Пользователь вводит регистрационные данные и данные карты через полосу.
  • Форма подтверждена для регистрационных данных.
  • Если форма действительна, оплата будет обработана.
  • Если оплата проходит, все в порядке, пользователь зарегистрирован и движется дальше.
  • Если платеж не удался, я хочу иметь возможность поднять ошибку проверки в скрытом поле формы. Это возможно?

Вот код представления формы:

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) 

ответ

20

Я решил ее вручную, добавляя ошибки в поле я хотел.

Похоже, что

try: 

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

решение работает для меня StripeError, но я также геокодирования с помощью Google а затем попытаться поднять ошибку, используя метод form.field.errors.append (''), но ошибка не появится. –

+0

Проблема заключалась в том, что добавление ошибок не останавливает выполнение остальной части кода (в конце я имел перенаправление). Я добавил дополнительный код, чтобы проверить, были ли у формы все еще ошибки перед перенаправлением. –

1

на самой вашей 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") 
+0

Разве этот подход не склонен к условиям гонки? –

Смежные вопросы