sergey_1990
@sergey_1990
1

Как сформировать и обработать url для древовидной модели используя get_absolute_url в DJANGO?

Коллеги, поделитесь опытом формирования ссылок для древовидных моделей! нужна структура /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)
  • Вопрос задан
  • 189 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы