Джанго - как выводить вложенные url?

Рейтинг: 0Ответов: 1Опубликовано: 24.02.2023

Доброго времени суток!

Не могу разобраться, как вывести вложенный url - категория/и относящийся к ней пост?

Есть категории с Slug и относящиеся к ним посты с Slug.

Нужно чтоб получилось:

/lettuce coat(slug категории)/salad-coat-without-mayonnaise (slug поста категории).

Заранее благодарю за помощь!

        Models
    
    class category(models.Model):
        slug = models.SlugField(max_length=266, unique=True, db_index=True, verbose_name=('URL'))
        description = models.TextField(max_length=700, verbose_name=('Описание'), blank=False)
    
        def __str__(self):
            return self.slug
    
        def get_absolute_url(self):
            return reverse('category', kwargs={'category_slug': self.slug})
        
    class post(models.Model):
        slug = models.SlugField(max_length=266, unique=True, db_index=True, verbose_name=('URL'))
        description = models.TextField(max_length=700, verbose_name=('Описание'), blank=False)
    
        cat = models.ForeignKey('category', on_delete=models.PROTECT, null=True)
    
        def __str__(self):
            return self.slug
    
        def get_absolute_url(self):
            return reverse('post', kwargs={'post_slug': self.slug})


 
        Views
     
    def ContentСategory(request, category_slug):
        category = get_list_or_404(post, slug=category_slug)
        category=category.objects.filter(slug=category_slug)
        return render(request, 'content/category.html',{'category':category})
    
    def ContentPost(request, post_slug):
        post = get_list_or_404(post, slug=post_slug)
        post=post.objects.filter(slug=post_slug)
        return render(request, 'content/post.html',{'post':post})




        URLS
    
    urlpatterns = [
        path('', views.ContentHome.as_view(), name='homepage'),
        path('<slug:category_slug>', views.ContentCategory, name='category'),
        path('<slug:category_slug>/<slug:post_slug>', views.ContentPost, name='post'),
    ]

Ответы

▲ 0

Судя по urlpatterns метод ContentPost должен принимать два параметра slug. А дальше просто добавь фильтр в выборку

 def content_post(request, category_slug, post_slug):
        post = get_list_or_404(post, slug=post_slug)
        post = post.objects.filter(slug=post_slug, cat__slug=category_slug)
        return render(request, 'content/post.html', {'post': post})

п.с.: Старайся исопльзовать pep8 при определении названий классов, методов и т.д. (Названия классов - CamelCase, функций under_score)