2017-01-28 9 views
1

Я в начальной стадии построения формы оплаты с помощью фотографии Stripe. Я использую библиотеку jquery.payment для форматирования своего месяца и года https://github.com/stripe/jquery.payment.Stripe - параметр «exp_month» должен быть целым числом (вместо этого, является 02) в Django View

Я создал exp поле ввода для сбора данных, но для того, чтобы получить Stripe требуется exp_month и exp_year поля я создал их в качестве новых переменных и взял значение моего exp поля и нарезанное значения мне нужно, то прошло на мой взгляд.

Правильные значения передаются моему представлению, но когда он достигает stripe.Token.create, я получаю ошибку stripe.error.CardError: Request req_A16AvRkITlz3Oi: The 'exp_month' parameter should be an integer (instead, is 02). в консоли. Замечание: Эта форма отлично работала, когда у меня было поле для exp_month и exp_year, но насколько это весело? :)

Ниже приведен код для обзора:

Аякса

var fields = { 
    number: 'null', 
    cvc: 'null', 
    exp: 'null', 
    exp_month: 'null', 
    exp_year: 'null' 
}; 

$('#plaqueFormBTN').click(function (e) { 
    e.preventDefault(); 
    fields.number = $('#id_number').val(); 
    fields.exp = $('#id_exp').val(); 
    fields.cvc = $('#id_cvc').val(); 

    $('#loader').show(); 

    var exp_month = fields.exp.slice(0, 3); 
    var exp_year = fields.exp.slice(5); 
    console.log(exp_month); 
    console.log(exp_year); 
    $.ajax({ 
     type: 'POST', 
     data: { 
      csrfmiddlewaretoken: getCookie('csrftoken'), 
      number: fields.number, 
      exp: fields.exp, 
      exp_month: exp_month, 
      exp_year: exp_year, 
      cvc: fields.cvc 

     }, 
     url: $('#plaqueForm').attr('action'), 
     cache: false, 
     ... 

вид

def plaque_order_form(request): 
    if request.method == 'POST': 
     form = PlaqueOrderForm(data=request.POST) 
     if form.is_valid(): 
      number = request.POST.get('number', '') 
      cvc = request.POST.get('cvc', '') 
      exp_month = request.POST.get('exp_month', '') 
      exp_year = request.POST.get('exp_year', '') 

      subject = 'New Plaque Order' 
      from_email = settings.DEFAULT_FROM_EMAIL 
      recipient_list = [from_email] 

      # Token is created using Stripe.js or Checkout! 
      # Get the payment token submitted by the form: 

      token = stripe.Token.create(
       card={ 
        'number': number, 
        'exp_month': exp_month, 
        'exp_year': exp_year, 
        'cvc': cvc 
       }, 
      ) 
      ... 

ответ

2

'02' является строкой поэтому она должна быть преобразована в межд перед тем как попасть в полосу. Вы, возможно, просто нужно сделать:

 exp_month = int(request.POST.get('exp_month', '')) 
     exp_year = int(request.POST.get('exp_year', '')) 
0

Вы должны получить доступ к данным через form.cleaned_data Словарь, а не непосредственно из POST. Помимо прочего, форма заботится о преобразовании в правильный тип данных.

+0

Преобразование к 'int' работал @danyamachine упоминалось, но я согласен с вами по поводу необходимости использовать очищенные данные, но у меня всегда были проблемы заставить его работать надежно. Я изменил свои поля для форматирования, как 'exp_year = form.cleaned_data.get («exp_year»)', и я получил сообщение об ошибке 'stripe.error.InvalidRequestError: Запрос req_A1C8GvSrpG3It3: отсутствуют необходимые параметры: exp_year. ' –