Коллеги, поделитесь опытом формирования ссылок для древовидных моделей! нужна структура /materials/level0/level1/ ... и т.д., у меня получилось сообразить рабочую версию но она мне не совсем нравится, хочу через reverse() сделать ... а как сделать именно эту вложенность и ее обработку в urls.py через реверс не пойму! Закоментированный код это то как хочу сделать, что раскоментировано то рабочая версия!
models.py
from django.db import models
from django.urls import reverse
from pytils.translit import slugify
from mptt.models import MPTTModel, TreeForeignKey
def get_all_ancestors(parent, url = ''):
url = '%s/%s' % (parent.slug, url)
if parent.parent:
return get_all_ancestors(parent.parent, url)
else:
return '/%s/' % url
class Category(MPTTModel):
autoregister_model = True
sort_id = models.CharField(max_length=30, verbose_name='Сортировочный ID', null=True)
title = models.CharField(max_length=50, verbose_name='Название')
description = models.TextField(verbose_name='Описание', blank=True, null=True)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children',
verbose_name='Родительская категория', limit_choices_to={'level': 0})
logo = models.CharField(max_length=250, verbose_name='Логотип', null=True, blank=True)
slug = models.SlugField()
class MPTTMeta:
order_insertion_by = ['title', ]
class Meta:
unique_together = [['parent', 'id']]
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
ordering = ['id', ]
def count_product(self):
return self.products.filter().count()
count_product.short_description = 'Количество товаров в категории'
def __str__(self):
return self.title
# def get_absolute_url(self):
# kwargs={'slug': self.slug }
# reverse('catalog_categories', kwargs=kwargs)
def get_absolute_url(self):
if self.parent is None:
return '/materials/%s/' % self.slug
url = get_all_ancestors(self.parent, self.slug)
return '/materials%s' % url
urls.py
from django.urls import path, re_path
from category.views import catalog_categories
from pages.views import index
urlpatterns = [
path('', index , name='index'),
# path('materials/<str:slug>/',catalog_categories , name='catalog_categories'),
re_path(r'^materials/[a-z0-9-_]+', catalog_categories ,name='catalog_categories'),
]
views.py
from django.shortcuts import render
from category.models import Category
# def catalog_categories(request, **kwargs):
# category = Category.objects.get(slug=kwargs['slug'])
# context = {'category':category}
# return render(request, 'catalog-categories.html', context)
def catalog_categories(request):
path = request.path.lstrip('materials')
path = path.strip('/').split('/')
category = Category.objects.get(slug = path[-1])
context = {'category':category}
return render(request, 'catalog-categories.html', context)