Вспомогательные страницы flatpages

Вы уже написали несколько страниц и view-функций для сайта. Помимо таких страниц на сайте могут понадобиться простые статичные страницы с текстом:
  • Контактная информация
  • Правила и условия использования
  • Юридическая информация
  • Условия размещения рекламы
  • ...и множество других
Создавать для каждой такой страницы отдельную view-функцию нерационально: клиент захочет редактировать эти страницы, а привлекать программистов ради исправления пары слов — долго и дорого.
Для управления такими страницами в Django есть приложение flatpages. Оно поставляется вместе с Django, вам надо его подключить и настроить.

Добавление приложения

Для подключения приложения добавьте его имя в список INSTALLED_APPS в конфиге сайта. Приложение flatpages зависит от приложения sites, оно есть в стандартной поставке Django, и его тоже нужно подключить:
Скопировать кодPYTHON
INSTALLED_APPS = [ 'users', 'posts', 'django.contrib.sites', 'django.contrib.flatpages', ... ]
Приложение sites подключает режим мультисайтовости и позволяет создавать «подсайты». Это полезно, если нужно создать и вести из одной админки несколько похожих сайтов. Мультисайтовость нам не понадобится, так что укажем в настройках ID текущего сайта и забудем об этом. Добавьте в файл yatube/settings.py новую строку:
Скопировать кодPYTHON
# Идентификатор текущего сайта SITE_ID = 1
В приложениях, которые вы подключили, есть свои модели, для них нужны таблицы в базе данных. Выполните миграции, чтобы всё заработало.

Настройка адресов и шаблонов flatpages

Пусть адрес вспомогательных страницы сайта будет начинаться со строки /about/. Добавьте в главный urls.py дополнительное правило:
Скопировать кодPYTHON
urlpatterns = [ # раздел администратора path('admin/', admin.site.urls), # flatpages path('about/', include('django.contrib.flatpages.urls')), # регистрация и авторизация path('auth/', include('users.urls')), path('auth/', include('django.contrib.auth.urls')), # импорт из приложения posts path('', include('posts.urls')), ]
В директорию templates добавьте шаблон для отображения статичных страниц, он должен быть доступен по адресу templates/flatpages/default.html:
Скопировать кодHTML
{% extends "base.html" %} {% block title %} {{ flatpage.title }} {% endblock %} {% block content %} <div class="container"> <h1>{{ flatpage.title }}</h1> {{ flatpage.content }} </div> {% endblock %}

Дополнительные настройки

После добавления приложений sites и flatpages в интерфейсе администратора добавилось два новых раздела:
image
Обратите внимание, что SITE_ID, который вы указывали в настройках, должен совпадать с id записи в модели Site. Первая запись там уже добавлена.
Для удобства в поле «Доменное имя» укажите локальный адрес компьютера:
image
В urlpatterns головного urls.py мы указали префикс /about/. Теперь адреса с этим префиксом маршрутизатор будет отдавать приложению flatpages. В urls.py приложения flatpages видно, что маска пути выглядит следующим образом:
Скопировать кодPYTHON
urlpatterns = [ path('<path:url>', views.flatpage, name='django.contrib.flatpages.views.flatpage'), ]
При обращении к статичной странице Django проверит на совпадение путь /about/, и оставшуюся часть адреса передаст во view-функцию flatpage() в переменной url.

Создание первой flatpage

В интерфейсе администратора перейдите к форме создания новой страницы:
image
В поле URL указывается уникальный в пределах сайта адрес без префикса /about
Создаваемая страница через поле Сайты привязывается к определённому сайту и показывается только на нём. Это важно для мультисайтового проекта, а нам проще: в системе только один сайт.
Создайте страницу обратной связи и сохраните её:
image
Поле содержимое позволяет вставлять HTML-код. На практике это приводит к тому, что неопытные администраторы сайта умудряются вставить код с незакрытыми или перепутанными тегами и полностью сломать отображение страницы. Такая ситуация встречается гораздо чаще, чем можно предположить.
При попытке кликнуть на ссылку "Смотреть на сайте" в новом окне откроется страница http://127.0.0.1:8000/contacts/ (без префикса /about) и появится сообщение об ошибке 404. Дело в том, что приложение flatpages «не знает», что его страницы расположены в разделе /about.
Удостоверьтесь, что страница открывается по адресу http://127.0.0.1:8000/about/contacts/
image
Приложение flatpages — не лучшая из систем для создания статичных страниц, но это простой предустановленный инструмент, дающий представление о таких приложениях.

Использование flatpages для предварительно заданных страниц

Страницы flatpages можно создавать с любыми адресами, выходя за пределы предустановленной структуры /about/page-name. Допустим, на сайте должны быть страницы «О нас» /about-us и «Условия использования» /terms, но их адреса не должны предваряться префиксом /about (для того, чтобы жизнь была веселее, с вами будут работать шаманы из SEO, специалисты по продвижению; зачастую именно они ставят условия по структуре и именам в URL).
Добавим в список urlpatterns головного urls.py адреса этих страниц:
Скопировать кодPYTHON
from django.contrib.flatpages import views urlpatterns = [ # тут все path() ] # добавим новые пути urlpatterns += [ path('about-us/', views.flatpage, {'url': '/about-us/'}, name='about'), path('terms/', views.flatpage, {'url': '/terms/'}, name='terms'), ]
Теперь страницы с адресами /about-us и /terms будут обрабатываться view-функцией flatpage() приложения flatpages.
{'url': '/about-us/'} и {'url': '/terms/'} — это параметры, которые path() передаёт в вызываемую view-функцию. Это даёт нам свободу: например, мы можем обработать URL /rasskaz-o-tom-kakie-my-horoshie точно так же, как и URL /about-us, «подменив» передаваемый во view-функцию параметр url
Скопировать кодPYHTON
urlpatterns = [ path('rasskaz-o-tom-kakie-my-horoshie/', views.flatpage, {'url': '/about-us/'}, name='about'), ]
Когда обработка «эксклюзивных» URL подготовлена — можно в админ-зоне создать две страницы, указав для них URL /about-us/ и /terms/ соответственно, и работать с ними, как с обычными flatpages.

Тестирование flatpages

Для полноценного покрытия сайта тестами вам понадобится создавать страницы программно. Для этого можно импортировать модель из модуля django/contrib/flatpages/models.py и перед тестированием создавать объекты. Точно так же можно работать и с моделью Site из django/contrib/sites/models.py.

Изменение сайта

Измените файл templates/footer.html следующим образом:
Скопировать кодHTML
<footer class="pt-4 my-md-5 pt-md-5 border-top"> <p class="m-0 text-dark text-center "><a href="/about-author/">Об авторе</a> - <a href="/about-spec/">Технологии</a></p> <p class="m-0 text-dark text-center ">Социальная сеть <span style="color:red">Ya</span>tube</p> </footer>
Добавьте в urls.py поддержку адресов страниц «Об авторе» /about-author и «Технологии» /about-spec.
Через админ-зону создайте страницу «Об авторе» и опубликуйте на ней информацию о себе со ссылками на ваш Github-профайл и на страницу вашего резюме, расскажите, что вас вдохновляет в текущий момент.
Вторую страницу назовите «Технологии»: расскажите на ней, какие программные инструменты вы применили для создания этого сайта.
Если во время работы вам помогал ваш кот, собака или другое домашнее животное — упомяните об этом: в среде программистов принято это указывать, без этого вас просто не возьмут на работу в приличную компанию! Настоящие хакеры еще выкладывают фотографию своей рабочей кружки (картинку можно положить в папку static, но не забудьте уменьшить размер файла до приемлемого).