Получаю ошибку 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')]
Ответы (1 шт):
Автор решения: alex
→ Ссылка
потому что не dispath а dispatch
https://docs.djangoproject.com/en/3.2/ref/class-based-views/generic-display/#detailview