Добрый день!
Делаю каталог, не могу понять почему не выводятся продукты по категориям каталога, выдает ошибку 404. Разделы в каталоге работают как надо. Вот код: Заранее благодарен за любую подсказку!
models.py
Python:
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>', 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'
def get_queryset(self):
product = get_object_or_404(Category, slug__iexact=self.kwargs.get('slug'))
queryset = product.category.all()
return queryset
В шаблоне ссылки прописываю:
HTML:
{% 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 то все откроется как надо (описание продукта).
Последнее редактирование: