Как выстроить иерархию новостей в django?

Добрый день.
Делаю тестовый проект, хочу разобраться, как работать с django. Делаю пример на основе раздела новости. Есть набор категорий и статей в модели. В модели новости указал:

category = models.ForeignKey('Category', on_delete=models.PROTECT, null=True, verbose_name='Категория')

связь работает, новости можно добавлять по категориям.
Вывод списка новостей, категорий и новостей по категориям я тоже смог сделать. Вопрос, а как сделать так, чтобы в адресе новости подставлялся адрес рубрики. То есть есть раздел news, в нем раздел политика, в нем новость. Я добавил новость в раздел, а в адресе чтобы автоматом от категории слаг подставлялся:

/news/politika/novost/

по документации я дошел пока до такого варианта:
urlpatterns = [
    path('', NewsHome.as_view(), name='news_index'),
    path('category/<slug:url>/', CategoryItem.as_view(), name='news_category'),
    path('<slug:url>/', NewsItem.as_view(), name='news_item'),
]
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 2
@maksam07
path('/news/<slug:cat>/<slug:news>', NewsItem.as_view(), name='news_item'),
Ответ написан
Комментировать
reimax
@reimax Автор вопроса
не работает.
из адреса я убираю /news/ так как первая строчка уже /news/ забирает на себя. верно?
если я верно понимаю, что slug:cat / slug:news должно как то ссылаться на адрес категории, но не работает. в модель что то нужно дописать?

urlpatterns = [
    path('', NewsHome.as_view(), name='news_index'),
    path('<slug:category_url>/', CategoryItem.as_view(), name='news_category'),
    path('<slug:category_url>/<slug:url>/', NewsItem.as_view(), name='news_item'),
]


class News(models.Model):
    title = models.CharField(max_length=250, db_index=True, verbose_name='Название')
    url = models.SlugField(max_length=250, unique=True, db_index=True, verbose_name='Адрес')
    category = models.ForeignKey('Category', on_delete=models.PROTECT, null=True, verbose_name='Категория')
    date = models.DateTimeField(default=datetime.now, blank=True, verbose_name='Дата')
    date_add = models.DateTimeField(auto_now_add=True, verbose_name='Дата добавления')
    date_edit = models.DateTimeField(auto_now=True, verbose_name='Дата изменения')
    text = models.TextField(blank=True, verbose_name='Содержание')
    photo = models.ImageField(upload_to='photo/%Y/%m/', blank=True, verbose_name='Изображение')
    active = models.BooleanField(default=True, verbose_name='Статус')
    views = models.PositiveIntegerField(default=0, verbose_name='Просмотры')

    def get_absolute_url(self):
        return reverse('news_item', kwargs={'url': self.url})

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Новость';
        verbose_name_plural = 'Новости';
        ordering = ['-date_add', '-id']

class Category(models.Model):
    title = models.CharField(max_length=250, db_index=True, verbose_name='Название')
    category_url = models.SlugField(max_length=250, unique=True, db_index=True, verbose_name='Адрес')
    text = models.TextField(blank=True, verbose_name='Содержание')

    def get_absolute_url(self):
        print(self.category_url)
        return reverse('news_category', kwargs={'category_url': self.category_url})

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Категория';
        verbose_name_plural = 'Категории';
        ordering = ['title']
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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