Отдельные части уже размещены в нужных местах: модель Post, определенна в файле models.py, post_list - в файле views.py и добавлен шаблон. Но как нам отобразить записи в шаблоне HTML-страницы? Ведь именно этого нам и нужно добиться: взять определенный контент (модели, сохраненные в базе данных) и аккуратно отобразить их в шаблоне, верно?
Для этого и предназначены представления: соединять между собой модели и шаблоны. В post_list представлениям нужно будет взять модели, которые мы хотим отобразить и передать их шаблону. Таким образом, в представлениях мы определяем что (какая модель) будет отображена в шаблоне.
Хорошо, так как мы этого добьемся?
Нам нужно открыть файл blog/views.py. Таким образом представление post_list будет выглядеть следующим образом:
from django.shortcuts import render
def post_list(request):
return render(request, 'blog/post_list.html', {})
Помнишь мы говорили о включении кода из других файлов? Теперь нам нужно включить модель, которую мы определили в файле models.py. Мы добавим строку from .models import Post следующим образом:
from django.shortcuts import render
from .models import Post
Точка перед from означает текущую директорию или текущее приложение. Поскольку views.py и models.py находятся в одной директории, мы можем использовать точку . и имя файла (без расширения .py). Затем мы импортируем модель (Post).
Но что дальше? Чтобы получить реальную запись из модели Post, нам нужен QuerySet.
ты уже должна быть знакома с принципом работы QuerySets. Мы говорили о нем в главе Django ORM (QuerySets).
Сейчас нас интересует список записей блога, отсортированных по published_date, согласна? Мы уже делали это в главе о QuerySets!
Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
Теперь нам нужно включить эту строку кода в файлblog/views.py, добавив её в функцию def post_list(request):
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {})
Пожалуйста, обрати внимание, что мы создали переменную для QuerySet: posts. Можешь думать о неё как об имени для нашего QuerySet. Теперь мы можем обращаться к нему, используя имя.
Кроме того, код использует функцию timezone.now(), так что нужно также импортировать timezone.
Нам осталось передать QuerySet posts в шаблон (мы расскажем о том, как отобразить его на странице в следующей главе).
В функции render мы уже имеем параметр request (т.е. все что мы получим от пользователя в качестве запроса через Интернет) и файл шаблона 'blog/post_list.html'. Последний параметр, который выглядит как {}, это место, куда мы можем добавить что-нибудь для использования в шаблоне. Мы должны задавать имена, передаваемым шаблону вещам (мы будем придерживаться 'posts' прямо сейчас :)). В итоге параметр будет выглядеть следующим образом: {'posts': posts}. Обрати внимание, что часть перед : является строкой; её нужно обернуть в кавычки ''.
В результате файл blog/views.py должен выглядеть следующим образом:
from django.shortcuts import render
from django.utils import timezone
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts})
Вот и все! Теперь пришло время перейти к шаблону и отобразить QuerySet на странице!
Подробнее о QuerySets в Django можно узнать в официальной документации: https://docs.djangoproject.com/en/1.8/ref/models/querysets/