Django урок 10: Индивидуальные страницы и обработчик ссылок

Создание обработчика ссылок

Для отображения отдельных статей необходим обработчик ссылок, проверяющий URL на соответствие шаблону /news/<число>. Добавим новую проверку в файл urls.py:

url(r'^news/(?P<pk>d+)$', views.NewsDetailView.as_view(), name='news-detail')

Разберем выражение:

  • r’^news/’ – начало строки с /news/.
  • (?P<pk>d+) – захват числового значения в именованную группу pk (первичный ключ). d+ означает одну или более цифр.
  • $ – конец строки.

Выражение проверяет, что URL начинается с /news/, за которым следует одна или более цифр, представляющих первичный ключ статьи.

Создание представления (View)

Для отображения статьи используем DetailView, а не ListView. В views.py создадим представление:

from django.views.generic import DetailView

class NewsDetailView(DetailView):
    model = Articles
    template_name = 'news/news_post.html'

model указывает на модель Articles, template_name – на шаблон news/news_post.html.

Создание шаблона (Template)

Создадим шаблон news/news_post.html. В отличие от шаблона списка статей, здесь не нужны циклы. Для вывода информации об статье используем:

<h1>{{ article.title }}</h1>
<div class="text-info">
    <p>Опубликовано: {{ article.date|date:"Y-m-d H:i:s" }}</p>
    <p>{{ article.text|safe|linebreaks }}</p>
</div>
  • {{ article.title }} – выводит заголовок статьи.
  • {{ article.date|date:"Y-m-d H:i:s" }} – выводит дату публикации в формате YYYY-MM-DD HH:MM:SS. Фильтр date форматирует дату.
  • {{ article.text|safe|linebreaks }} – выводит текст статьи. Фильтр safe разрешает HTML-теги, linebreaks преобразует символы перевода строки в HTML-теги <br>.

Результат

После обновления сервера и перехода по ссылке на конкретную статью (например, /news/1) отобразится отдельная страница со всей информацией: заголовок, дата публикации и текст.

В уроке создан функционал отображения отдельных страниц новостей, используя обработчик URL, представление DetailView и шаблон. Сайт стал функциональнее и удобнее.

Что будем искать? Например,программа