У меня есть список категорий с подкатегориями. Не знал как сделать подкатегории чтоб не создавать отдельную модель и наследоваться к ней. Пошел в гуглить писали про библиотеку Django mptt успешно ее импортировал в проект и радовался до момента пока не понял что у меня не получается сделать обратное разрешение url адресов по полю slug так как его просто нет ибо поле с подкатегориями наследуется от сомой себя. Гуглил но без результата. Как сделать чтоб была сортировка товаров по подкатегориям. Может есть другие библиотеки или другое решение. Это учебный проект я только учусь сори если тупой вопрос и спасибо заранее
Код модели:
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey #Для древовидного структурирования
class Category(MPTTModel, models.Model):
name = models.CharField(max_length=150, unique=True, verbose_name='Имя категории')
slug = models.SlugField(max_length=200, unique=True, blank=True, null=True, verbose_name='URL')
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='subcatery', verbose_name='Под категория')
class Meta:
db_table = 'category' # Переименнование таблицы в базе данных
verbose_name = 'Категорию'
verbose_name_plural = 'Категории'
class MPTTMeta:
order_insertion_by = ['name'] # Определяет порядок, в котором дочерние элементы будут добавляться в дерево
def __str__(self):
return self.name
Код urls главного приложения:
from django.urls import include, path
from django.contrib import admin
from django.conf.urls.static import static
from app import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('main.urls', namespace='main')),
path('catalog/', include('goods.urls', namespace='goods')),
]
if settings.DEBUG:
urlpatterns += [
path('__debug__/', include('debug_toolbar.urls')) #Подключение toolbara
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Код url созданного приложения:
from django.urls import path
from goods.views import catalog, product
app_name = 'goods'
urlpatterns = [
path('', catalog, name='catalog'),
path('product/<slug:product_slug>/', product, name='product'), #Обратное разрешение url адресов
]
Код views:
from django.shortcuts import render
from goods.models import Product, Category
def catalog(request):
products = Product.objects.all()
categories = Category.objects.all()
context = {
'title': 'Suruchi - Shop',
'categories': categories,
'products': products,
}
return render(request, 'goods/shop.html', context)
Кусок кода из html куда вставляются категории:
<div class="offcanvas__filter--sidebar__inner">
<div class="single__widget widget__bg">
<h2 class="widget__title h3">Categories</h2>
<ul class="widget__categories--menu">
{% recursetree categories %}
<li class="widget__categories--menu__list">
<label class="widget__categories--menu__label d-flex align-items-center">
<span class="widget__categories--menu__text">{{ node.name }}</span>
<svg class="widget__categories--menu__arrowdown--icon" xmlns="http://www.w3.org/2000/svg" width="12.355" height="8.394">
<path d="M15.138,8.59l-3.961,3.952L7.217,8.59,6,9.807l5.178,5.178,5.178-5.178Z" transform="translate(-6 -8.59)" fill="currentColor"></path>
</svg>
</label>
{% if not node.is_leaf_node %}
<ul class="widget__categories--sub__menu">
{% for child in node.get_children %}
<li class="widget__categories--sub__menu--list">
<a class="widget__categories--sub__menu--link d-flex align-items-center" href="{% url "goods:catalog" %}">
<span class="widget__categories--sub__menu--text">{{ child.name }}</span>
</a>
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
</div>
Картинка как это выглядит на сайте
Картинка как это выглядит в админке