Django: подробная информация не отображается и ошибки нет

models.py

import sys
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 PIL import Image
from django.core.files.uploadedfile import InMemoryUploadedFile
from django.urls import reverse

from io import BytesIO


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):
    MIN_RESOLUTION = (400,400)
    MAX_RESOLUTION = (1000,1000)
    MAX_IMAGE_SIZE = 52428

    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(verbose_name='Описание', null=True)
    price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name = 'Цена')

    def __str__(self):
        return self.title


class Notebook(Product):
    diagonal = models.CharField(max_length=255, verbose_name='Диагональ')
    display_type = models.CharField(max_length=255, verbose_name='Тип дисплея')
    processor_freq = models.CharField(max_length=255, verbose_name='Частота процессора')
    ram = models.CharField(max_length=255, verbose_name='Оперативная память')
    video = models.CharField(max_length=255, verbose_name = 'Видеокарта')
    time_without_charge = 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 Smartphone(Product):
    diagonal = models.CharField(max_length=255, verbose_name='Диагональ')
    display_type = models.CharField(max_length=255, verbose_name='Тип дисплея')
    resolution = models.CharField(max_length=255, verbose_name= 'Разрешение экрана')
    accum_volue = models.CharField(max_length=255, verbose_name='Оперативная память')
    sd =models.BooleanField(default=True)
    sd_volue_max = models.CharField(max_length = 255, verbose_name = 'Максимальный объём встраивамой памяти')
    main_cam_mp = models.CharField(max_length = 255, verbose_name = 'Главная камера')
    frontal_cam_mp = 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')

views.py

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


from .models import Notebook, Smartphone


def test_view(request):
    return render(request, 'base.html', {})


class ProductDetailView(DetailView):
    CT_MODEL_MODEL_CLASS = {
        'notebook': Notebook,
        'smartphone': Smartphone
    }

    def dispatch(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)

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

product_detail.html

<div class="product">
  <div class="product-title">
    {{ product.title }}
  </div>
  {% if product.description %}
  <div class="product-description">
    {{ product.description }}
  </div>
  {% endif %}
</div>

urls.py

from django.urls import path


from .views import (test_view, ProductDetailView)


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

Ответы (0 шт):