Начнем с создания представления для отображения списка постов. Отредактируйте файл views.py
приложения blog
, чтобы он выглядел следующим образом:
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_list(request):
posts = Post.published.all()
return render(request,
'blog/post/list.html',
{'posts': posts})
Это первое представление Django. Представление post_list
принимает объект request
в качестве единственного параметра. Он обязателен для всех представлений. В этом представлении можно получить все посты с помощью статуса published
из менеджера published
, который был создан ранее.
Наконец, используется ярлык render()
. Она представляется Django для рендеринга списка постов с заданным шаблоном. Эта функция принимает объект request
, путь шаблона и контекстные переменные для отрисовки выбранного шаблона. Она возвращает объект HttpResponce
с отрисованным текстом (обычно это код HTML). Ярлык render()
учитывает контекст запроса, поэтому любая переменная из контекстного процессора шаблона может использоваться для заданного шаблона. Процессоры контекста для шаблонов — это всего лишь вызываемые объекты, которые назначают переменные для контекста.
Создадим второе представление для отображения одного поста. Добавьте следующую функцию в файл views.py
:
def post_detail(request, year, month, day, post):
post = get_object_or_404(Post, slug=post,
status='published',
publish__year=year,
publish__month=month,
publish__day=day)
return render(request,
'blog/post/detail.html',
{'post': post})
Это представление поста. Оно принимает year
, month
, day
и параметры post
для получения опубликованного поста с заданным slug
и датой. Стоит обратить внимание, что при создании модели Post
в поле slug
было добавлено поле unique_for_date
. Таким образом можно удостовериться, что будет только один пост с такой ссылкой в указанную дату, а это значит, что с помощью даты и ссылки (slug) всегда можно получить один конкретный пост. В этом представлении используется ярлык get_object_or_404()
для получения нужной записи. Функция возвращает объект, параметры которого совпадают с запросом или запускает исключение HTTP 404 (не найдено), если такой не был найдет. В конце используется ярлык render()
для отрисовки полученного поста с помощью шаблона.