Шаблон главной страницы
Создадим и подключим шаблон главной страницы проекта 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
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})
Результатом будет вот такая страница: