Разработка представлений списка и детальной информации
Теперь, когда вы понимаете, как использовать ORM-преобразователь, вы готовы к разработке представлений приложения blog.
Представление Django – это просто функция Python, которая получает веб-запрос и возвращает веб-ответ. Вся логика желаемого ответа находится внутри функции-представления.
Сначала в своем приложении нужно создать функции-представления, затем по каждому представлению сформировать шаблон URL-адреса и, наконец, создать шаблоны HTML, чтобы прорисовывать сгенерированные представлениями данные.
Каждое представление будет прорисовывать шаблон, передавая ему переменные, и возвращать HTTP-ответ с прорисованным результатом.
Создание представлений списка постов и детальной информации о посте
Давайте начнем с создания представления списка постов на странице.
Отредактируйте файл views.py приложения blog, придав ему следующий вид:
from django.shortcuts import render
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, путь к шаблону и контекстные переменные, чтобы прорисовать данный шаблон.
Она возвращает объект HttpResponse с прорисованным текстом (обычно исходным кодом HTML).
Функция сокращенного доступа render() учитывает контекст запроса, поэтому любая переменная, установленная процессорами контекста шаблона, доступна данному шаблону.
Процессоры контекста шаблона - это просто вызываемые объекты (функции, методы и классы), которые назначают контекст переменным.
Давайте создадим второе представление одиночного поста на странице.
Добавьте следующую ниже функцию в файл views.py:
# импорт....
from django.http import Http404 # новый импорт
#### функция post_list
def post_detail(request, id):
try:
post = Post.published.get(id=id)
except Post.DoesNotExist:
raise Http404("No Post found.")
return render(request,
'blog/post/detail.html',
{'post': post})
Это представление детальной информации о посте.
Указанное представление принимает аргумент id поста. Здесь мы пытаемся извлечь объект Post с заданным id, через наш кастомный менеджер, который выводит опубликованные записи. И он же в свою очередь вызывает метод get() стандартного менеджера objects.
Мы создаем исключение Http404, чтобы вернуть ошибку HTTP с кодом состояния, равным 404, если возникает исключение DoesNotExist, то есть модель не существует, поскольку результат не найден.
Наконец, мы используем функцию сокращенного доступа render(), чтобы прорисовать извлеченный пост с использованием шаблона.
Применение функции сокращенного доступа get_object_or_404()
Django предоставляет функцию сокращенного доступа для вызова метода get() в заданном модельном менеджере и вызова исключения Http404 вместо исключения DoesNotExist, когда объект не найден.
Отредактируйте файл views.py, импортировав функцию сокращенного доступа get_object_or_404 и изменив представление post_detail, как показано ниже:
from .models import Post
from django.shortcuts import render, get_object_or_404
def post_list(request):
posts = Post.published.all()
return render(request,
'blog/post/list.html',
{'posts': posts})
def post_detail(request, id):
post = get_object_or_404(Post,
id=id, status=Post.Status.PUBLISHED)
return render(request,
'blog/post/detail.html',
{'post': post})
Теперь в представлении детальной информации о посте используется функция сокращенного доступа get_object_or_404(), чтобы извлекать желаемый пост.
Указанная функция извлекает объект, соответствующий переданным параметрам, либо исключение HTTP с кодом состояния, равным 404(не найдено), если объект не найден.