Сведения о вопросе

l3o

11:51, 11th November, 2022

Теги

django  

Не понимаю почему не открывается детальное описание продукта

Просмотров: 4349   Ответов: 0

Добрый день! Не могу разобраться с выводом товаров по категории. Суть  такая, есть каталог, в каталоге категории и в эти категории добавляется один товар. Например в админке добавляю например каталог МЕБЕЛЬ, далее в этом каталоге добавляем две категории ДЛЯ КУХНИ и ДЛЯ СПАЛЬНИ и добавляем уже продукт КРОВАТЬ для категории ДЛЯ СПАЛЬНИ. Вобщем каталоги и разделы открываются, но при попытке перейти в продукт КРОВАТЬ пишет страница не найдена 404.

Вот код

models.py

from django.db import models
from django.urls import reverse
 
class Catalog(models.Model):
 
sections = models.CharField(max_length=150, db_index=True, verbose_name="Название")
img = models.ImageField(upload_to='img/catalog/')
slug = models.SlugField(max_length=150, db_index=True, unique=True, null=True)
 
class Meta:
ordering = ('sections',)
index_together = (('id', 'slug'),)
verbose_name = 'Главная страница каталога'
verbose_name_plural = 'Главная страница каталога'
 
def __str__(self):
return self.sections
 
def get_absolute_url(self):
return reverse('catalog', kwargs={"slug": self.slug})


 
class Category(models.Model):
catalog = models.ForeignKey(Catalog, related_name='catalog', on_delete=models.CASCADE,
verbose_name='Выбрать каталог'
)
name = models.CharField(max_length=150, db_index=True, verbose_name="Название")
img = models.ImageField(upload_to='img/catalog/')
slug = models.SlugField(max_length=200, db_index=True, unique=True, null=True)
 
class Meta:
ordering = ('name',)
index_together = (('id', 'slug'),)
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
 
def __str__(self):
return self.name
 
def get_absolute_url(self):
return reverse('catalog-detail', kwargs={"slug": self.slug})
 
class Product(models.Model):
category = models.ForeignKey(Category, related_name='category', on_delete=models.CASCADE,
verbose_name='Выбрать категорию'
)
name = models.CharField(max_length=255, db_index=True,unique=True, null=True, verbose_name="Название")
text = models.TextField('Текст')
url = models.CharField(max_length=255, db_index=True, verbose_name="Ссылка на сайт")
pdf = models.FileField(upload_to='pdf/')
slug = models.SlugField(max_length=200, db_index=True, unique=True, null=True)
 
class Meta:
ordering = ('name',)
index_together = (('id', 'slug'),)
verbose_name = 'Продукт'
verbose_name_plural = 'Продукты'
 
def __str__(self):
return self.name
 
def get_absolute_url(self):
return reverse('product-detail', kwargs={"slug": self.slug})
 
class Gallery(models.Model):
image = models.ImageField(upload_to='img/catalog/')
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='images')
class Meta:
verbose_name = 'Галерея'
verbose_name_plural = 'Галереи'

urls.py:

from django.contrib import admin
from django.urls import path, include
 
from . import views
 
urlpatterns = [
path('', views.CatalogView.as_view(), name='catalog'),
path('<slug>/', views.CatalogDetailViews.as_view(), name='catalog-detail'),
path('product/<slug:slug>', views.ProductDetailViews.as_view(), name='product-detail')
]

views.py:

from django.shortcuts import render, get_object_or_404
from .models import Catalog_text, Catalog, Category, Product
from django.views.generic import DetailView, ListView
 
class CatalogView(ListView):
model = Catalog
template_name = 'catalog/catalog.html'
context_object_name = 'catalog'
 
class CatalogDetailViews(ListView):
model = Category
template_name = 'catalog/catalog-detail.html'
context_object_name = 'category'
 
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(CatalogDetailViews, self).get_context_data(**kwargs)
# Add in a QuerySet of all the Baklawa
context['cat'] = Catalog.objects.all()
return context
 
def get_queryset(self):
category = get_object_or_404(Catalog, slug__iexact=self.kwargs.get('slug'))
queryset = category.catalog.all()
return queryset
 
class ProductDetailViews(DetailView):
model = Product
template_name = 'catalog/product-detail.html'
context_object_name = 'product'


 

 

В шаблоне :

{% for cat in category %}
                    <div class="room-item catalog_items">
                        <ul class="hover-effect-cover">
                            <li>
                              <img src="{{ cat.img.url }}" alt="">
                              
                              <div class="effect-to-top">
                                <h3>{{ cat.name }}</h3>
                                <p></p>
                                <a href="{% url 'product-detail' cat.id %}" class="button">ПОДРОБНЕЕ</a>
                              </div>
                            </li>
                        </ul>
                    </div>
                    {% endfor %}

 

Допустим я в админке категория test и продукт для этой категории product1, ссылка в шаблоне получается catalog/product/test и соответственно выдает 404, но если я руками поправлю ссылу в адресной строке на catalog/product/product1 то все откроется как надо (описание продукта).

 



Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться