Получение объекта "NoneType" не имеет атрибута«исключение - PullRequest
0 голосов
/ 19 сентября 2019

Я очень старался выяснить проблему, но мне не удалось. Я получаю следующее исключение:

Объект Error-NoneType не имеет атрибута "members_type"

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

models.py

from django.conf import settings
from django.db import models
from django.db.models.signals import post_save

import stripe

stripe.api_key = settings.STRIPE_SECRET_KEY

MEMBERSHIP_CHOICES = (
    ('Enterprise','ent'),
    ('Professional','pro'),
    ('Free','free')
)


class Membership(models.Model):
    slug = models.SlugField()
    membership_type = 
models.CharField(choices=MEMBERSHIP_CHOICES,default='Free',max_length=30)
    price = models.IntegerField(default=15)
    stripe_plan_id = models.CharField(max_length=40)

    def __str__(self):
    return self.membership_type


class UserMembership(models.Model):
    user= models.OneToOneField(settings.AUTH_USER_MODEL, 
on_delete=models.CASCADE)
    stripe_customer_id = models.CharField(max_length=40)
    membership = models.ForeignKey(Membership, on_delete=models.SET_NULL, 
null=True)

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

def post_save_usermembership_create(sender,instance, created, *args, 
**kwargs):
    if created:
        UserMembership.objects.get_or_create(user= instance)
    user_membership, created = UserMembership.objects.get_or_create(user= 
instance)

    if user_membership.stripe_customer_id is None or 
           user_membership.stripe_customer_id=='':
        new_customer_id = stripe.Customer.create(email= instance.email)
        user_membership.stripe_customer_id = new_customer_id['id']
        user_membership.save()


post_save.connect(post_save_usermembership_create,
                      sender=settings.AUTH_USER_MODEL)




class Subscription(models.Model):
    user_membership = models.ForeignKey(UserMembership, 
                      on_delete=models.CASCADE)
    stripe_subscription_id = models.CharField(max_length=40)
    active = models.BooleanField(default=True)

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

курсы / views.py

from django.shortcuts import render

from django.views.generic import ListView, DetailView,View

from .models import Course, Lesson

from membership_app.models import UserMembership
class CourseListView(ListView):
    model = Course

class CourseDetailView(DetailView):
    model = Course

class LessonDetailView(View):
    def get(self, request, course_slug, lesson_slug, *args, **kwargs):

        course_qs = Course.objects.filter(slug=course_slug)
        if course_qs.exists():
            course = course_qs.first()

        lesson_qs = course.lessons.filter(slug=lesson_slug)
        if lesson_qs.exists():
            lesson = lesson_qs.first()

        user_membership = UserMembership.objects.filter(user = request.user).first()
        user_membership_type = 
       getattr(user_membership.membership,'membership_type',None)
        # print(user_membership_type)

        course_allowed_membership_type = course.allowed_membership.all()

        context = {
           'object': None
        }

        if course_allowed_membership_type.filter(membership_type=user_membership_type).exists():
           context = {'object':lesson}

        return render(request, "courses/lesson_detail.html",context)

шаблоны

 {% if object is not None %}
        {{ object.title }}
        {{ object.description }}
{% else %}
    <h3>Upgrade Membership</h3>
{% endif %}

1 Ответ

0 голосов
/ 19 сентября 2019

Ваша проблема в этой строке.

    user_membership_type = user_membership.membership.membership_type

Причина в том, что вы разрешаете UserMembership.membership быть нулевым значением.Поэтому, когда вы получаете UserMembership с membership, равным None, а затем пытаетесь получить membership_type, возникает ошибка.Я думаю, что getattr - ваше лучшее решение этой проблемы.

    user_membership_type = getattr(user_membership.membership, 'membership_type', None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...