Вспомогательные страницы 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),
path('about/', include('django.contrib.flatpages.urls')),
path('auth/', include('users.urls')),
path('auth/', include('django.contrib.auth.urls')),
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 в интерфейсе администратора добавилось два новых раздела:
Обратите внимание, что SITE_ID, который вы указывали в настройках, должен совпадать с id записи в модели Site. Первая запись там уже добавлена.
Для удобства в поле «Доменное имя» укажите локальный адрес компьютера:
В 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
В интерфейсе администратора перейдите к форме создания новой страницы:
В поле URL указывается уникальный в пределах сайта адрес без префикса /about
Создаваемая страница через поле Сайты привязывается к определённому сайту и показывается только на нём. Это важно для мультисайтового проекта, а нам проще: в системе только один сайт.
Создайте страницу обратной связи и сохраните её:
Поле содержимое позволяет вставлять HTML-код. На практике это приводит к тому, что неопытные администраторы сайта умудряются вставить код с незакрытыми или перепутанными тегами и полностью сломать отображение страницы. Такая ситуация встречается гораздо чаще, чем можно предположить.
При попытке кликнуть на ссылку "Смотреть на сайте" в новом окне откроется страница http://127.0.0.1:8000/contacts/
(без префикса /about
) и появится сообщение об ошибке 404. Дело в том, что приложение flatpages «не знает», что его страницы расположены в разделе /about
.
Удостоверьтесь, что страница открывается по адресу http://127.0.0.1:8000/about/contacts/
Приложение flatpages — не лучшая из систем для создания статичных страниц, но это простой предустановленный инструмент, дающий представление о таких приложениях.
Использование flatpages для предварительно заданных страниц
Страницы flatpages можно создавать с любыми адресами, выходя за пределы предустановленной структуры /about/page-name
. Допустим, на сайте должны быть страницы «О нас» /about-us
и «Условия использования» /terms
, но их адреса не должны предваряться префиксом /about
(для того, чтобы жизнь была веселее, с вами будут работать шаманы из SEO, специалисты по продвижению; зачастую именно они ставят условия по структуре и именам в URL).
Добавим в список urlpatterns
головного urls.py адреса этих страниц:
Скопировать кодPYTHON
from django.contrib.flatpages import views
urlpatterns = [
]
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, но не забудьте уменьшить размер файла до приемлемого).