Вложенное представление в django, дающее TypeError из-за дополнительного аргумента, переданного __init __ () - PullRequest
1 голос
/ 11 марта 2019

У меня есть представление, в котором я пытаюсь выполнить все следующие действия:

  • Расширить существующую форму, добавив дополнительные поля, которые не соответствуют модели
  • Проверкаесли данные формы действительны
  • Создайте токен полосы и обработайте платеж
  • Если этот платеж успешен, сохраните поля non-cc в форме в моем локальном БД

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

Однако при попытке проверить я получаю сообщение об ошибке:

TypeError at /url/linked/to/view
__init__() takes 1 positional argument but 2 were given

При попытке решить эту проблему самостоятельно я столкнулся с этим вопросом.Судя по ответам на этот вопрос, короткий ответ, по-видимому, заключается в том, что добавление self в качестве первого аргумента к соответствующему методу должно решить проблему, хотя в данном случае это не так.

Мое мнение:

class payment_order(View):
    def post(self, request):
        card_num = request.POST['card_num']
        exp_month = request.POST['exp_month']
        exp_year = request.POST['exp_year']
        cvc = request.POST['cvc']
        email = request.POST['email']
        cart = Cart(request)

        if request.method == 'POST':
            form = OrderPayForm(request.POST)
            if form.is_valid():

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

                charge = stripe.Charge.create(
                  amount=cart.item['price'],
                  currency="usd",
                  source=token,
                  description="order for "+ email
                )

                if charge['captured'] == True:
                    order = form.save()
                    for item in cart:
                        OrderItem.objects.create(
                            order=order,
                            product=item['product'],
                            price=item['price'],
                        )
                    return render(request, 'orders/created.html', {'order': order})
                else:
                    form = OrderPayForm()
                    return render(request, 'orders/create.html', {'form': form})

Я не переопределил __init__(), и кроме использования полосовых методов и более глубокого уровня вложенности, чем мои другие представления, я не думаю, что делаю что-то необычное.Что вызывает эту ошибку в этом случае?

1 Ответ

0 голосов
/ 12 марта 2019

Я удалю этот ответ, если кто-то опубликует лучшее решение, но я подумал, что это может помочь другим в случае, если они столкнутся с подобной проблемой.

По сути, я решил эту проблему, переключившись с представления на основе классов на представление на основе функций и слегка изменив логику в последних нескольких строках.

Мой новый вид, который работает:

def payment_order(request):
    card_num = request.POST.get('card_num', False)
    exp_month = request.POST.get('exp_month', False)
    exp_year = request.POST.get('exp_year ', False)
    cvc = request.POST.get('cvc', False)
    email = request.POST.get('email', False)
    cart = Cart(request)

    if request.method == 'POST':
        form = OrderPayForm(request.POST)
        if form.is_valid():

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

            charge = stripe.Charge.create(
              amount=cart.item['price'],
              currency="usd",
              source=token,
              description="order for "+ email
            )

            if charge['captured'] == True:
                order = form.save()
                for item in cart:
                    OrderItem.objects.create(
                        order=order,
                        product=item['product'],
                        price=item['price'],
                    )
                return render(request, 'orders/created.html', {'order': order})
    form = OrderPayForm()
    return render(request, 'orders/create.html', {'form': form})
...