Вы уже создали несколько страниц и view-функций в проекте Yatube. Но помимо страниц с динамическим содержимым на сайте могут понадобиться и простые статичные страницы:
- контактная информация,
- правила и помощь,
- юридическая информация
…и множество других.В Django есть view-класс TemplateView, который создан для таких случаев. Этот простой класс по умолчанию обрабатывает только GET-запросы и возвращает страницу, сформированную на основе указанного шаблона и словаря контекста (словарь не обязателен: содержимое страницы может быть описано прямо в шаблоне).
Страница в три счёта
Раз: view-класс
# views.py
# Импорт класса TemplateView, чтобы унаследоваться от него
from django.views.generic.base import TemplateView
class JustStaticPage(TemplateView):
# В переменной template_name обязательно указывается имя шаблона,
# на основе которого будет создана возвращаемая страница
template_name = 'app_name/just_page.html'
Два: шаблон
<!-- templates/app_name/just_page.html -->
<html>
<head>
<title>Очень простая страница</title>
</head>
<body>
<div class="header">JUST SITE</div>
<h1>Очень простая страница</h1>
<p>На создание этой страницы у меня ушло пять минут! Ай да я.</p>
<div class="footer">© JUST SITE, все права </div>
</body>
</html>
Три: путь
# urls.py
...
urlpatterns = [
...
path('justpage/', views.JustStaticPage.as_view())
]
Готово!
По ссылке /justpage/ откроется страница, где хвалят разработчика этой страницы.
Можно и с контекстом
Класс TemplateView
может передавать в шаблон словарь context
, для этого нужно переопределить метод класса get_context_data()
:
# views.py
from django.views.generic.base import TemplateView
class JustStaticPage(TemplateView):
template_name = 'app_name/just_page.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Здесь можно произвести какие-то действия для создания контекста.
# Для примера в словарь просто передаются две строки
context['just_title'] = 'Очень простая страница'
context['just_text'] = ('На создание этой страницы '
'у меня ушло пять минут! Ай да я.')
return context
А шаблон, как и всегда, может рендериться на основе нескольких других шаблонов и словаря context
:
<!-- templates/app_name/just_page.html -->
<html>
<head>
<title>{{ just_title }}</title>
</head>
<body>
{% include 'includes/header.html' %}
<h1>{{ just_title }}</h1>
<p>{{ just_text }}</p>
{% include 'includes/footer.html' %}
</body>
</html>
Класс TemplateView
отлично подходит
- для отображения простых статичных страниц, например «Об авторе» или «О компании»;
- для отображения страниц с простым контекстом;
- для отображения страниц, всё содержимое которых описано в HTML-шаблоне.
Класс TemplateView
не стоит применять
- для работы с любыми HTTP-запросами, кроме GET;
- для операций CRUD. Не имеет смысла расширять класс
TemplateView
, для CRUD есть специальные классы —FormView
,CreateView
иUpdateView
.
Особенности класса TemplateView
:
- По умолчанию класс
TemplateView
ответит только на GET-запрос. На запросы других типов класс вернёт код 405: HttpResponseNotAllowed. - Класс не поддерживает формы.
- Переменная
template_name
(путь к файлу шаблона) обязательно должна быть объявлена в классе.
С остальными особенностями этого класса можно познакомиться в официальной документации.
Задание
Создайте в проекте Yatube две статичные страницы на основе TemplateView
: «Об авторе» и «Технологии». Весь текст вставьте прямо в шаблон, словарь context
передавать не нужно.Адреса страниц должны быть такими:
- Об авторе:
/about/author/
- Технологии:
/about/tech/
Страница «Об авторе»
На этой странице опубликуйте информацию о себе. Дайте ссылки на ваш аккаунт в Github, на страницу вашего резюме и на любые другие ваши ресурсы в сети, расскажите, что вас вдохновляет, как вы пришли в мир программирования и как вы себя ощущаете в этом мире.Если во время работы вам помогал ваш кот, собака, жёлтая резиновая уточка или другое домашнее животное — обязательно упомяните об этом: так принято в среде программистов; без этого вас могут не взять на работу в приличную компанию!Хорошим тоном считается выложить фотографию своей рабочей кружки или образцового порядка на вашем рабочем столе. Картинку можно положить в папку /static. Не забудьте уменьшить размер файла до приемлемого.
Страница «Технологии»
На этой странице можно рассказать, какие программные инструменты вы применили для создания этого сайта, какие навыки вам помогли, с чем вы хорошо разобрались, а с чем — не очень. Картинки и нестандартные подходы приветствуются: эта страница может получиться очень интересной.
Приложение about
Для структурирования проекта создайте приложение about, оно будет управлять статичными страницами, описывающими проект.Запустите виртуальное окружение проекта; из рабочей директории проекта выполните в консоли команду python3 manage.py startapp about
После создания приложения не забудьте зарегистрировать его в settings.py.
urls.py для статических страниц
Все URL проекта, начинающиеся с префикса about/, должны обрабатываться в about/urls.py.
Добавьте в головной urls.py новый path()
:
urlpatterns = [
...
path('about/', include('about.urls', namespace='about')),
]
В файле about/urls.py будут обрабатываться два адреса:
# файл about/urls.py
from django.urls import path
from . import views
app_name = 'about'
urlpatterns = [
path('author/', views.AboutAuthorView.as_view(), name='author'),
path('tech/', views.AboutTechView.as_view(), name='tech'),
]
Строка app_name = 'about'
— обязательна. Без неё namespace
не сработает.
View-классы для статических страниц
Опишите два view-класса, наследующихся от TemplateView: AboutAuthorView
и AboutTechView
. Каждый из них должен вызывать свой шаблон; словарь с контекстом передавать не нужно.
# about/views.py
# Импортировать TemplateView
# Описать класс AboutAuthorView для страницы about/author
# Описать класс AboutTechView для страницы about/tech
Шаблоны для статических страниц
В директорию /templates добавьте шаблоны статичных страниц. Они должны быть доступны по адресам templates/about/author.html и templates/about/tech.htmlКод шаблона author.html может быть таким:
<!-- templates/about/author.html -->
{% extends "base.html" %}
{% block title %}Об авторе проекта{% endblock %}
{% block content %}
<h1>Привет, я автор</h1>
<p>
Тут я размещу информацию о себе используя свои умения верстать.
Картинки, блоки, элементы бустрап. А может быть, просто напишу несколько абзацев текста.
</p>
{% endblock %}
Код шаблона tech.html:
<!-- templates/about/tech.html -->
{% extends "base.html" %}
{% block title %}Технологии{% endblock %}
{% block content %}
{% comment %} Колонки с отступом сверху и снизу {% endcomment %}
<div class="row">
<h1>Вот что я умею</h1>
{% comment %}
Боковой блок со списком технологий
Займет всю ширину блока на мобильном
и 25% при размерах экрана ≥768px
{% endcomment %}
<aside class="col-12 col-md-3">
<ul class="list-group list-group-flush">
<li class="list-group-item">
Python
</li>
<li class="list-group-item">
Django
</li>
</ul>
</aside>
{% comment %}
Статья
Займет всю ширину блока на мобильном
и 75% при размерах экрана ≥768px
{% endcomment %}
<article class="col-12 col-md-9">
<p>Текст страницы "Технологии"</p>
</article>
</div>
{% endblock %}