Экземпляр клиента имеет недопустимый идентификатор: Нет, . ID должен быть типа str (или unicode). - PullRequest
0 голосов
/ 05 мая 2020

я пытаюсь создать полосовую карту, но у меня возникает эта ошибка «Не удалось определить, какой URL-адрес запрашивать: экземпляр клиента имеет недопустимый идентификатор: Нет,. ID должен иметь тип str (или unicode

это мой view.py

'' '

def index(request):
    # if request.user.is_authenticated:
    #   billing_profile=request.user.billingprofile
    #   my_customer_id=billing_profile.customer_id
    billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(request)

    if not billing_profile:
        return redirect("carts:cart_view ")
    next_url = None
    next_ = request.GET.get('next')
    if is_safe_url(next_, request.get_host()):
        next_url=next_

    return render(request, 'my_index.html',{"next_url":next_url})


def charge(request):

    if request.method == 'POST':
        print('Data:', request.POST)
    # stripe.Customer.create(
    #   email=request.POST['email'],
    #
    # )
    billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(request)
    token = request.POST.get('stripeToken')
    if token is not None:
     customer = stripe.Customer.retrieve(billing_profile.customer_id)
     card_response=customer.sources.create(source=token)
     print(card_response)
    return redirect(reverse('Payments:success'))


def successMsg(request):

    return render(request, 'my_success.html')

это моя model.py

class BillingProfileManager(models.Manager):
    def new_or_get(self,request):
        user=request.user
        guest_email_id = request.session.get('guest_email_id')
        created=False
        obj=None
        if user.is_authenticated:
            # logged in user checkout ;remember payement stuff
            obj, created=self.model.objects.get_or_create(
                user=user, email=user.email
            )
        elif guest_email_id is not None:
            # logged in user checkout, auto reload  payement stuff
            guest_email_obj = GuestEmail.objects.get(id=guest_email_id)
            obj, created = BillingProfile.objects.get_or_create(
                email=guest_email_obj.email)
        else:
            pass
        return obj,created
class BillingProfile(models.Model):
    user=models.OneToOneField(User,unique=True,null=True,blank=True,on_delete='CASCADE')
    email=models.EmailField()
    active=models.BooleanField(default=True)
    updated = models.DateTimeField(auto_now=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    customer_id=models.CharField(max_length=120,null=True,blank=True)
    objects=BillingProfileManager()

    def __str__(self):
        return self.email
def billing_profile_created_receiver(sender,instance,*args,**kwargs):
    if not instance.customer_id and instance.email and instance.user:
        print("Actual api request send to stripe/braintree")
        customer=stripe.Customer.create(
            email=instance.email,
            name=instance.user,
            source=instance.default_source
        )
        print(customer)
        instance.customer_id=customer.id
pre_save.connect(billing_profile_created_receiver,sender=BillingProfile)

def user_creaeted_receiver(sender,instance,created,*args,**kwargs):
    if created and instance.email:
        BillingProfile.objects.get_or_create(user=instance,email=instance.email)
post_save.connect(user_creaeted_receiver,sender=User)

1 Ответ

0 голосов
/ 05 мая 2020

Я предполагаю, что при вызове менеджера new_or_get() он создаст BillingProfile без фактического customer_id, указывающего на полосу, поскольку она создается в сигнале.

Это означает, что возвращенный obj from BillingProfileManager.new_or_get() не будет заполнен customer_id.

Либо выберите не обрабатывать это создание во время сигнала, либо (решение, которое мне не обязательно нравится) вызовите billing_profile.refresh_from_db() перед получение объекта Customer из Stripe в представлении charge()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...