Получаю ошибку ImproperlyConfigured в следствие некорректной работы DetailView (django)

Я новенький в джанго. Делаю интернет-магазин по туториалу. Сутки искал причину в ошибке. По сути нет причин для ошибки. Но все же получаю вот такую ошибку

ImproperlyConfigured at /store/products/weapons/weapon98/
ProductDetailView is missing a QuerySet. Define ProductDetailView.model, ProductDetailView.queryset, or override ProductDetailView.get_queryset().
Request Method: GET
Request URL:    http://127.0.0.1:8000/store/products/weapons/weapon98/
Django Version: 3.1.13
Exception Type: ImproperlyConfigured
Exception Value:    
ProductDetailView is missing a QuerySet. Define ProductDetailView.model, ProductDetailView.queryset, or override ProductDetailView.get_queryset().
Exception Location: C:\Users\User\.virtualenvs\projectpubg-FOdvnZxA\lib\site-packages\django\views\generic\detail.py, line 69, in get_queryset
Python Executable:  C:\Users\User\.virtualenvs\projectpubg-FOdvnZxA\Scripts\python.exe
Python Version: 3.8.5
Python Path:    
['C:\\Users\\User\\Desktop\\IT\\projectpubg',
 'c:\\python385\\python38.zip',
 'c:\\python385\\DLLs',
 'c:\\python385\\lib',
 'c:\\python385',
 'C:\\Users\\User\\.virtualenvs\\projectpubg-FOdvnZxA',
 'C:\\Users\\User\\.virtualenvs\\projectpubg-FOdvnZxA\\lib\\site-packages']
Server time:    Wed, 14 Jul 2021 19:45:50 +0000

Вот мой файл views.py

from django.shortcuts import render
from django.views.generic import DetailView, TemplateView

from .models import Weapon, Helmet, Armor, Backpack, Clothes


class ProductDetailView(DetailView):

    CT_MODEL_MODEL_CLASS = {
        'weapons': Weapon,
        'helmets': Helmet,
        'armors': Armor,
        'backpacks': Backpack,
        'clothes': Clothes
    }

    def dispath(self, request, *args, **kwargs):
        self.model = self.CT_MODEL_MODEL_CLASS[kwargs['ct_model']]
        self.queryset = self.model._base_manager.all()
        return super().dispatch(request, *args, **kwargs)

    context_object_name = 'product'
    template_name = 'product_detail.html'
    slug_url_kwarg = 'slug'


class StorePageView(TemplateView):
    template_name = 'store.html'

models.py

from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
from django.urls import reverse


User = get_user_model()


def get_product_url(obj, viewname):
    ct_model = obj.__class__._meta.model_name
    return reverse(viewname, kwargs={'ct_model': ct_model, 'slug': obj.slug})


class LatestProductsManager:
    @staticmethod
    def get_products_for_main_page(*args, **kwargs):
        with_respect_to = kwargs.get('with_respect_to')
        products = []
        ct_models = ContentType.objects.filter(model__in=args)
        for ct_model in ct_models:
            model_products = ct_model.model_class()._base_manager.all().order_by('-id')[:5]
            products.extend(model_products)
        if with_respect_to:
            ct_model = ContentType.objects.filter(model=with_respect_to)
            if ct_model.exists():
                if with_respect_to in args:
                    return sorted(
                        products, key=lambda x: x.__class__._meta.model_name.startswith(with_respect_to), reverse=True)
        return products


class LatestProducts:

    objects = LatestProductsManager()


class Category(models.Model):

    name = models.CharField(max_length=255, verbose_name="Ім'я категорії")
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.name


class Product(models.Model):

    class Meta:
        abstract = True

    category = models.ForeignKey(Category, verbose_name='Категорія', on_delete=models.CASCADE)
    title = models.CharField(max_length=255, verbose_name='Найменування')
    slug = models.SlugField(unique=True)
    image = models.ImageField(verbose_name='Зображення')
    description = models.TextField(null=True, verbose_name='Опис товару')
    price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Ціна')

    def __str__(self):
        return self.title


class CartProduct(models.Model):

    user = models.ForeignKey('Customer', verbose_name='Покупатель', on_delete=models.CASCADE)
    cart = models.ForeignKey('Cart', verbose_name='Кошик', on_delete=models.CASCADE, 
related_name='related_products')
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    qty = models.PositiveIntegerField(default=1)
    final_price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Загальна ціна')

    def __str__(self):
        return 'Продукт: {} (для кошика)'.format(self.product.title)


class Weapon(Product):

    weapon_type = models.CharField(max_length=255, verbose_name='Тип зброї')
    duration = models.CharField(max_length=255, verbose_name='Тривалість активності')

    def __str__(self):
        return '{} : {}'.format(self.category.name, self.title)

    def get_absolute_url(self):
        return get_product_url(self, 'product_detail')


class Helmet(Product):

    helmet_level = models.CharField(max_length=255, verbose_name='Рівень каски')
    duration = models.CharField(max_length=255, verbose_name='Тривалість активності')

    def __str__(self):
        return '{} : {}'.format(self.category.name, self.title)

    def get_absolute_url(self):
        return get_product_url(self, 'product_detail')


class Armor(Product):

    armor_level = models.CharField(max_length=255, verbose_name='Рівень бронижелета')
    duration = models.CharField(max_length=255, verbose_name='Тривалість активності')

    def __str__(self):
        return '{} : {}'.format(self.category.name, self.title)

    def get_absolute_url(self):
        return get_product_url(self, 'product_detail')


class Backpack(Product):
    backpack_level = models.CharField(max_length=255, verbose_name='Рівень рюкзака')
    duration = models.CharField(max_length=255, verbose_name='Тривалість активності')

    def __str__(self):
        return '{} : {}'.format(self.category.name, self.title)

    def get_absolute_url(self):
        return get_product_url(self, 'product_detail')


class Clothes(Product):

    clothes_type = models.CharField(max_length=255, verbose_name='Вид одягу')
    duration = models.CharField(max_length=255, verbose_name='Тривалість активності')

    def __str__(self):
        return '{} : {}'.format(self.category.name, self.title)

    def get_absolute_url(self):
        return get_product_url(self, 'product_detail')


class Cart(models.Model):

    owner = models.ForeignKey('Customer', verbose_name='Власник', on_delete=models.CASCADE)
    products = models.ManyToManyField(CartProduct, blank=True, related_name='related_cart')
    total_products = models.PositiveIntegerField(default=0)
    final_price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Загальна ціна')

    def __str__(self):
        return str(self.id)


class Customer(models.Model):

    user = models.ForeignKey(User, verbose_name='Користувач', on_delete=models.CASCADE)
    phone = models.CharField(max_length=20, verbose_name='Номер телефону')
    address = models.CharField(max_length=255, verbose_name='Адреса')

    def __str__(self):
        return 'Покупець: {} {}'.format(self.user.first_name, self.user.last_name)

urls.py

from django.urls import path

from .views import ProductDetailView, StorePageView

urlpatterns = [
    path('', StorePageView.as_view(), name='store'),
    path('products/<str:ct_model>/<str:slug>/', ProductDetailView.as_view(), 
    name='product_detail')]