Динамически изменяющиеся данные в шаблонах

Отдельные части уже размещены в нужных местах: модель Post определена в файле models.py, post_list — в файле views.py, и добавлен шаблон. Но как нам отобразить записи в шаблоне HTML-страницы? Ведь именно этого нам и нужно добиться: взять определённый контент (модели, сохранённые в базе данных) и аккуратно отобразить их в шаблоне, верно?

Для этого и предназначены представления: соединять между собой модели и шаблоны. В post_list представлению нужно будет взять модели, которые мы хотим отобразить, и передать их шаблону. Таким образом, в представлениях мы определяем, что (какая модель) будет отображена в шаблоне.

Хорошо, так как мы этого добьёмся?

Нам нужно открыть файл blog/views.py. Пока что представление post_list выглядит следующим образом:

blog/views.py

from django.shortcuts import render

def post_list(request):
    return render(request, 'blog/post_list.html', {})

Помнишь, мы говорили о включении кода из других файлов? Теперь нам нужно включить модель, которую мы определили в файле models.py. Мы добавим строку from .models import Post следующим образом:

blog/views.py

from django.shortcuts import render
from .models import Post

Точка перед models означает текущую директорию или текущее приложение. Поскольку views.py и models.py находятся в одной директории, мы можем использовать точку . и имя файла (без расширения .py). Затем мы импортируем модель (Post).

Но что дальше? Чтобы получить реальную запись из модели Post, нам нужен QuerySet.

QuerySet

Ты уже должна быть знакома с принципом работы QuerySet. Мы говорили о нём в главе Django ORM (QuerySets).

Сейчас нас интересует список записей блога, отсортированных по published_date, согласна? Мы уже делали это в главе о QuerySet!

blog/views.py

Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')

Теперь нам нужно включить эту строку кода в файлblog/views.py, добавив её в функцию def post_list(request), но сначала не забудь добавить строку from django.utils import timezone:

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', {})

Нам осталось передать QuerySet posts в шаблон (мы расскажем о том, как отобразить его на странице, в следующей главе).

Пожалуйста, обрати внимание, что мы создали переменную для QuerySet: posts. Можешь думать о ней как об имени для нашего QuerySet. Теперь мы можем обращаться к нему, используя имя.

В функции render у нас уже есть параметр request (т.е. всё, что мы получим от пользователя в качестве запроса через Интернет) и файл шаблона 'blog/post_list.html'. Последний параметр, который выглядит как {}, — это место, куда мы можем добавить что-нибудь для использования в шаблоне. Мы должны задавать имена передаваемым шаблону вещам (прямо сейчас мы остановимся на 'posts' :)). В итоге параметр будет выглядеть следующим образом: {'posts': posts}. Обрати внимание, что часть перед : является строкой; её нужно обернуть в кавычки ''.

В результате файл blog/views.py должен выглядеть следующим образом:

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.11/ref/models/querysets/

results matching ""

    No results matching ""