Шаблон главной страницы

Создадим и подключим шаблон главной страницы проекта Yatube
Для начала подготовим директорию для хранения шаблонов. В файле настроек yatube/settings.py за работу шаблонов отвечает раздел TEMPLATES. Сейчас он выглядит так:
Скопировать кодPYTHON
TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ] }, } ]
В переменной BACKEND указано, какой язык шаблонов мы будем применять в проекте. Django поддерживает два похожих языка шаблонов: Django Template Language (DTL) и Jinja2. Оставим значение по умолчанию: наш выбор — DjangoTemplates
В переменной DIRS хранится список директорий, где лежат шаблоны сайта. Создайте папку templates в основной директории проекта:
Скопировать кодHTML
yatube ├── db.sqlite3 ├── manage.py ├── posts │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── **templates** //директория для шаблонов └── yatube ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
Теперь в переменной DIRS в yatube/settings.py можно указать путь к шаблонам:
Скопировать кодPYTHON
TEMPLATES_DIR = os.path.join(BASE_DIR, "templates") TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [TEMPLATES_DIR], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ] }, } ]

Шаблон главной страницы

В директории yatube/templates/ создайте шаблон главной страницы index.html с таким кодом:
Скопировать кодHTML
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Последние обновления | Yatube</title> </head> <body> <h1>Последние обновления на сайте</h1> {% for post in posts %} <h3> Автор: {{ post.author.get_full_name }}, дата публикации: {{ post.pub_date|date:"d M Y" }} </h3> <p>{{ post.text|linebreaksbr }}</p> <hr> {% endfor %} </body> </html>

Функция render

Теперь нужно изменить view-функцию index в файле posts/views.py. Добавьте в неё вызов шаблона index.html и отправку данных в этот шаблон:
Скопировать кодPYTHON
from django.shortcuts import render from .models import Post def index(request): latest = Post.objects.order_by("-pub_date")[:11] return render(request, "index.html", {"posts": latest})
Обратите внимание, что функция render возвращает специальный объект, который должна вернуть view-функция. Частая ошибка — вызывать функцию, но не передать результат ее выполнения в операторе return.
Скопировать кодPYTHON
# Совсем неправильно, функция вернет None: забыли return def index_wrong(request): latest = Post.objects.order_by("-pub_date")[:11] render(request, "index.html", {"posts": latest}) # Хороший вариант: промежуточные переменные полезны def index_ok(request): latest = Post.objects.order_by("-pub_date")[:11] response = render(request, "index.html", {"posts": latest}) return response # Хороший вариант: без промежуточных переменных - короче def index_ok_too(request): latest = Post.objects.order_by("-pub_date")[:11] return render(request, "index.html", {"posts": latest})
Результатом будет вот такая страница:
image