Django - как правильно создавать категории и подкатегории

В настоящее время я работаю над магазином, сделанным на Django, и у меня возникла проблема, потому что у меня есть модель для категории и подкатегории. Проблема в том, что я не знаю, что я сделал не так, потому что в html файле я пытаюсь вызвать и категории и подкатегории, но в каждой категории отображаются все подкатегории, вместо того, чтобы принадлежать определенной категории. Очень прошу помочь и проверить, правильно ли написаны файлы ниже. Заранее спасибо

models.py

from django.db import models
from django.urls import reverse


# Class model for category
class Category(models.Model):
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            db_index=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('selcorshop:product_list_by_category',
                       args=[self.slug])


# Class model for subcategory
class Subcategory(models.Model):
    category = models.ForeignKey(Category,
                                 related_name='category',
                                 on_delete=models.CASCADE)
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            db_index=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'subcategory'
        verbose_name_plural = 'subcategories'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('selcorshop:product_list_by_subcategory',
                       args=[self.slug])


# Class model for product
class Product(models.Model):
    subcategory = models.ForeignKey(Subcategory,
                                 related_name='products',
                                 on_delete=models.CASCADE)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d',
                              blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('selcorshop:product_detail',
                       args=[self.id, self.slug])

views.py

from django.shortcuts import render, get_object_or_404
from .models import Category, Subcategory, Product
from cart.forms import CartAddProductForm


# View for product list in site
def product_list(request, category_slug=None, subcategory_slug=None):
    category = None
    categories = Category.objects.all()
    subcategory = None
    subcategories = Subcategory.objects.all()
    products = Product.objects.filter(available=True)
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        subcategory = get_object_or_404(Subcategory, slug=subcategory_slug)
        products = products.filter(category=category)
    return render(request,
                  'selcorshop/product/list.html',
                  {'category': category,
                   'categories': categories,
                   'subcategory': subcategory,
                   'subcategories': subcategories,
                   'products': products})


# View for single product
def product_detail(request, id, slug):
    product = get_object_or_404(Product,
                                id = id,
                                slug = slug,
                                available = True)
    # Add to cart button
    cart_product_form = CartAddProductForm()
    return render(request,
                  'selcorshop/product/detail.html',
                  {'product': product,
                   'cart_product_form': cart_product_form})

urls.py

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static


app_name = 'selcorshop'
urlpatterns =[
    path('', views.product_list, name='product_list'),
    path('<slug:category_slug>/', views.product_list, name='product_list_by_category'),
    path('<slug:subcategory_slug>/', views.product_list, name='product_list_by_subcategory'),
    path('<int:id>/<slug:slug>/', views.product_detail, name='product_detail'),
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

list.html

Посмотрев ваш код, я догадался, что вы хотите создать выпадающее меню, в котором будут открываться все подкатегории, связанные с категорией, так что для этого вы можете вызвать его с соответствующим именем, которое вы передадите в вашей модели подкатегории, и использовать его в вашем HTML, как это

{% for c in category_list  %}
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle text-dark" href="#" id="navbarDarkDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false" style="font-weight:500">
              <strong>{{ c.name }}</strong>
            </a>
            <ul class="dropdown-menu" aria-labelledby="navbarDarkDropdownMenuLink">
              {% for subcategory in c.category.all %}
              <li><a class="dropdown-item" href="#">{{ subcategory.name }}</a>
              {% endfor %}
            </ul>
          </li>
          {% endfor %}

это должно решить вашу проблему и сообщите мне, если у вас все еще есть проблемы

Вернуться на верх