AttributeError 'User' объект не имеет атрибута 'userStripe' - PullRequest
0 голосов
/ 03 июля 2018

Использование Stripe API для создания формы оформления кредитной карты на моем веб-сайте. Я пытаюсь проверить следующую строку в моей view.py проверки приложения.

print (request.user.userStripe.stripe_id)

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

У меня есть два приложения: пользователи и проверка

У меня следующая ошибка на странице отладки

AttributeError at /checkout/
'User' object has no attribute 'userStripe'
Request Method: GET
Request URL:    http://127.0.0.1:8000/checkout/
Django Version: 1.11
Exception Type: AttributeError
Exception Value:    
'User' object has no attribute 'userStripe'
Exception Location: /home/dominic/Desktop/Projects/decentraland/website/manaland/manaland/env/lib/python3.4/site-packages/django/utils/functional.py in inner, line 239
Python Executable:  /home/dominic/Desktop/Projects/decentraland/website/manaland/manaland/env/bin/python
Python Version: 3.4.3
Python Path:    
['/home/dominic/Desktop/Projects/decentraland/website/manaland/manaland',
 '/home/dominic/Desktop/Projects/decentraland/website/manaland/manaland/env/lib/python3.4',
 '/home/dominic/Desktop/Projects/decentraland/website/manaland/manaland/env/lib/python3.4/plat-x86_64-linux-gnu',
 '/home/dominic/Desktop/Projects/decentraland/website/manaland/manaland/env/lib/python3.4/lib-dynload',
 '/usr/lib/python3.4',
 '/usr/lib/python3.4/plat-x86_64-linux-gnu',
 '/home/dominic/Desktop/Projects/decentraland/website/manaland/manaland/env/lib/python3.4/site-packages']
Server time:    Mon, 2 Jul 2018 22:38:35 +0000

checkout.views.py

from django.conf import settings
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from users.models import User, profile, userStripe
from django.views import generic
from django.views.generic import CreateView


#TODO UPDATE WITH LIVE VERISON FOR STRIPE API KEYS

import stripe
stripe.api_key = settings.STRIPE_SECRET_KEY

# Create your views here.
@login_required
def checkout(request):
    publishKey = settings.STRIPE_PUBLISHABLE_KEY
    print (request.user.userStripe.stripe_id)
    if request.method == 'POST':
        token = request.POST['stripeToken']
                # Token is created using Checkout or Elements!
        # Get the payment token ID submitted by the form:
        try:
            charge = stripe.Charge.create(
                amount=999,
                currency='usd',
                description='Example charge',
                source=token,
            )
        except stripe.error.CardError as e:

            pass
    context = {'publishKey': publishKey}
    template = 'checkout/checkout.html'
    return render(request, template, context)

users.models.py

from django.contrib.auth.models import AbstractUser
from django.core.urlresolvers import reverse
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _

from django.conf import settings
from allauth.account.signals import user_logged_in, user_signed_up
import stripe
stripe.api_key = settings.STRIPE_SECRET_KEY



@python_2_unicode_compatible
class User(AbstractUser):

    # First Name and Last Name do not cover name patterns
    # around the globe.
    name = models.CharField(_('Name of User'), blank=True, max_length=255)
    bio = models.CharField( blank=True, max_length=255)
    image = models.ImageField(null=True, blank=True)

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': self.username})

class profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    description = models.CharField( blank=True, max_length=255)
    image = models.ImageField(null=True, blank=True)

    def __str__(self):
        return self.user.username

class userStripe(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    stripe_id = models.CharField(max_length=200, null=True, blank=True)

    def __unicode__(self):
        if self.stripe_id:
            return str(self.stripe_id)
        else:
            return self.user.username

def stripeCallback(sender, request, user, **kwargs):
    user_stripe_account, created = userStripe.objects.get_or_create(user=user)
    if created:
        print ('created for %s'%(user.username))
    if user_stripe_account.stripe_id is None or user_stripe_account.stripe_id == '':
        new_stripe_id = stripe.Customer.create(email=user.email)
        user_stripe_account.stripe_id = new_stripe_id['id']
        user_stripe_account.save()


def profileCallback(sender, request, user, **kwargs):
    userProfile, is_created = profile.objects.get_or_create(user=user)
    if is_created:
        userProfile.name = user.username
        userProfile.save()

user_logged_in.connect(stripeCallback)
user_signed_up.connect(profileCallback)
user_signed_up.connect(stripeCallback)

1 Ответ

0 голосов
/ 03 июля 2018

Вы должны использовать название модели в нижнем регистре, print(request.user.userstripe.stripe_id). Лучше установить related_name в вашем OneToOneField, чтобы вы точно знали, как получить доступ к userStripe из user.

class userStripe(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='user_stripe')
    ...

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