Приложение flatpages
Django включает необязательное приложение «flatpages». Оно позволяет хранить «плоский» HTML-контент в базе данных и управлять им через интерфейс администратора Django и API на Python.
Плоская страница — это объект с URL, заголовком и содержимым. Используйте её для отдельных страниц особого назначения, например страниц «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать отдельное приложение Django.
Для плоской страницы можно использовать собственный шаблон или шаблон по умолчанию, общий для всей системы. Её можно связать с одним или несколькими сайтами.
Поле содержимого можно оставить пустым, если вы предпочитаете разместить содержимое в собственном шаблоне.
Установка
Чтобы установить приложение flatpages, выполните следующие действия:
-
Установите
sites framework, добавив'django.contrib.sites'в настройкуINSTALLED_APPS, если его там ещё нет.Также убедитесь, что для
SITE_IDправильно задан идентификатор сайта, который представляет файл настроек. Обычно это1(то естьSITE_ID = 1), но если вы используете фреймворк sites для управления несколькими сайтами, это может быть идентификатор другого сайта. - Добавьте
'django.contrib.flatpages'в настройкуINSTALLED_APPS.
Затем выполните одно из следующих действий:
-
Добавьте запись в свой URLconf. Например:
urlpatterns = [ path("pages/", include("django.contrib.flatpages.urls")), ]
или:
- Добавьте
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'в настройкуMIDDLEWARE. - Выполните команду
manage.py migrate.
Как это работает
manage.py migrate создаёт в базе данных две таблицы: django_flatpage и django_flatpage_sites. django_flatpage — это справочная таблица, которая сопоставляет URL с заголовком и текстовым содержимым. django_flatpage_sites связывает плоскую страницу с сайтом.
Использование URLconf
Есть несколько способов включить плоские страницы в URLconf. Можно выделить для них отдельный путь:
urlpatterns = [
path("pages/", include("django.contrib.flatpages.urls")),
]
Также можно настроить шаблон «catchall». В этом случае важно поместить его в конец остальных шаблонов urlpatterns:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
re_path(r"^(?P<url>.*/)$", views.flatpage),
]
Предупреждение
Если для APPEND_SLASH задано значение False, необходимо убрать косую черту из шаблона catchall, иначе плоские страницы без завершающей косой черты не будут найдены.
Ещё один распространённый вариант — использовать плоские страницы для ограниченного набора известных страниц и явно указать их URL в URLconf:
from django.contrib.flatpages import views
urlpatterns += [
path("about-us/", views.flatpage, kwargs={"url": "/about-us/"}, name="about"),
path("license/", views.flatpage, kwargs={"url": "/license/"}, name="license"),
]
Аргумент kwargs задаёт значение url, используемое для поиска модели FlatPage в представлении плоской страницы.
Аргумент name позволяет выполнять обратное разрешение URL в шаблонах, например с помощью шаблонного тега url.
Использование middleware
FlatpageFallbackMiddleware может выполнить всю необходимую работу.
-
class FlatpageFallbackMiddleware[исходный код] -
Каждый раз, когда любое приложение Django выдаёт ошибку 404, это middleware в крайнем случае проверяет базу данных плоских страниц на наличие запрошенного URL. В частности, оно ищет плоскую страницу с заданным URL и идентификатором сайта, соответствующим настройке
SITE_ID.Если совпадение найдено, выполняется следующий алгоритм:
- Если для плоской страницы задан собственный шаблон, загружается этот шаблон. В противном случае загружается шаблон
flatpages/default.html. - В шаблон передаётся одна переменная контекста —
flatpage, содержащая объект плоской страницы. Для рендеринга шаблона используетсяRequestContext.
Middleware добавит завершающую косую черту и выполнит перенаправление (с учётом настройки
APPEND_SLASH) только в том случае, если полученный URL ведёт на существующую плоскую страницу. Перенаправления являются постоянными (код состояния 301).Если совпадение не найдено, обработка запроса продолжается обычным образом.
Middleware активируется только при ошибках 404 — не при ошибках 500 и не при ответах с любым другим кодом состояния.
- Если для плоской страницы задан собственный шаблон, загружается этот шаблон. В противном случае загружается шаблон
Для плоских страниц не применяется middleware представлений
Поскольку FlatpageFallbackMiddleware применяется только после неудачного разрешения URL, завершившегося ошибкой 404, в возвращаемом им ответе не будут применяться методы middleware представлений. Middleware представлений применяется только к запросам, которые успешно направлены к представлению посредством обычного разрешения URL.
Обратите внимание, что порядок элементов в MIDDLEWARE имеет значение. Обычно FlatpageFallbackMiddleware можно поместить в конец списка. Это означает, что при обработке ответа middleware запустится первым и позволит другим middleware, обрабатывающим ответы, увидеть настоящий ответ плоской страницы, а не ошибку 404.
Подробнее о middleware читайте в документации по middleware.
Убедитесь, что ваш шаблон 404 работает
Обратите внимание, что FlatpageFallbackMiddleware срабатывает только после того, как другое представление успешно вернуло ответ 404. Если другое представление или класс middleware пытается вернуть ошибку 404, но вместо этого вызывает исключение, ответом станет HTTP 500 («Внутренняя ошибка сервера»), и FlatpageFallbackMiddleware не станет пытаться отобразить плоскую страницу.
Как добавлять, изменять и удалять плоские страницы
Предупреждение
Право добавлять или редактировать плоские страницы следует предоставлять только пользователям, которым вы доверяете. Плоские страницы задаются в виде необработанного HTML и Django их не очищает. В результате вредоносная плоская страница может привести к различным уязвимостям безопасности, включая повышение привилегий.
Через интерфейс администратора
Если вы активировали автоматический интерфейс администратора Django, на главной странице администратора должен отображаться раздел «Плоские страницы». Редактируйте плоские страницы так же, как и любые другие объекты в системе.
У модели FlatPage есть поле enable_comments, которое по умолчанию не используется приложением contrib.flatpages, но может быть полезно в вашем проекте или сторонних приложениях. Оно не отображается в интерфейсе администратора, но вы можете добавить его, зарегистрировав собственный ModelAdmin для FlatPage:
from django.contrib import admin
from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.models import FlatPage
from django.utils.translation import gettext_lazy as _
# Define a new FlatPageAdmin
class FlatPageAdmin(FlatPageAdmin):
fieldsets = [
(None, {"fields": ["url", "title", "content", "sites"]}),
(
_("Advanced options"),
{
"classes": ["collapse"],
"fields": [
"enable_comments",
"registration_required",
"template_name",
],
},
),
]
# Re-register FlatPageAdmin
admin.site.unregister(FlatPage)
admin.site.register(FlatPage, FlatPageAdmin)
Через API на Python
Плоские страницы представлены стандартной моделью Django FlatPage. Доступ к объектам плоских страниц можно получить через API базы данных Django.
Проверяйте URL плоских страниц на дубликаты.
Если вы добавляете или изменяете плоские страницы собственным кодом, вероятно, вам понадобится проверять, нет ли дублирующихся URL плоских страниц на одном сайте. Форма плоской страницы, используемая в интерфейсе администратора, выполняет такую проверку; её можно импортировать из django.contrib.flatpages.forms.FlatpageForm и использовать в собственных представлениях.
Модель FlatPage
-
class models.FlatPage
Поля
У объектов FlatPage есть следующие поля:
- classmodels.FlatPage
-
-
url -
Обязательное поле. Не более 100 символов. Индексируется для ускорения поиска.
-
title -
Обязательное поле. Не более 200 символов.
-
content -
Необязательное поле (
blank=True).TextField, обычно содержащее HTML-контент страницы.
-
enable_comments -
Логическое значение. По умолчанию это поле не используется приложением
flatpagesи не отображается в интерфейсе администратора. Подробное объяснение см. в разделе об интерфейсе администратора для плоских страниц.
-
template_name -
Необязательное поле (
blank=True). Не более 70 символов. Указывает шаблон, используемый для отображения страницы. Если значение не задано, используетсяflatpages/default.html.
-
Методы
- classmodels.FlatPage
-
-
get_absolute_url() -
Возвращает относительный путь URL страницы на основе атрибута
url.
-
Шаблоны плоских страниц
По умолчанию плоские страницы отображаются с помощью шаблона flatpages/default.html, но для отдельной плоской страницы его можно переопределить: в интерфейсе администратора свёрнутая группа полей «Дополнительные параметры» (нажмите на неё, чтобы раскрыть) содержит поле для указания имени шаблона. Если вы создаёте плоскую страницу через API на Python, можно задать имя шаблона в поле template_name объекта FlatPage.
Создание шаблона flatpages/default.html — ваша задача; в каталоге шаблонов создайте каталог flatpages, содержащий файл default.html.
В шаблоны плоских страниц передаётся одна переменная контекста — flatpage, содержащая объект плоской страницы.
Вот пример шаблона flatpages/default.html:
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
Поскольку вы уже вводите необработанный HTML на странице администратора для плоской страницы, для flatpage.title и flatpage.content указано, что в шаблоне не требуется автоматическое экранирование HTML.
Получение списка объектов FlatPage в шаблонах
Приложение flatpages предоставляет шаблонный тег, позволяющий перебрать все доступные плоские страницы на текущем сайте.
Как и для всех пользовательских шаблонных тегов, перед использованием необходимо загрузить библиотеку пользовательских тегов. После загрузки библиотеки можно получить все плоские страницы текущего сайта с помощью тега get_flatpages:
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
Отображение плоских страниц registration_required
По умолчанию шаблонный тег get_flatpages отображает только плоские страницы, помеченные как registration_required = False. Чтобы отображать плоские страницы, доступные только после регистрации, необходимо указать аутентифицированного пользователя с помощью условия for.
Например:
{% get_flatpages for someuser as about_pages %}
Если передать анонимного пользователя, get_flatpages будет работать так же, как если бы пользователь не был указан, — то есть будет отображать только общедоступные плоские страницы.
Ограничение плоских страниц по базовому URL
Необязательный аргумент starts_with позволяет ограничить возвращаемые страницы теми, URL которых начинается с указанного базового URL. Этот аргумент можно передать в виде строки или переменной, значение которой будет получено из контекста.
Например:
{% get_flatpages '/about/' as about_pages %}
{% get_flatpages about_prefix as about_pages %}
{% get_flatpages '/about/' for someuser as about_pages %}
Интеграция с django.contrib.sitemaps
-
class FlatPageSitemap[исходный код] -
Класс
sitemaps.FlatPageSitemapпроверяет все общедоступныеflatpages, определённые для текущего значенияSITE_ID(см.sites documentation), и создаёт запись в карте сайта. Эти записи содержат только атрибутlocation— без атрибутовlastmod,changefreqиpriority.
Пример
Вот пример URLconf, использующего FlatPageSitemap:
from django.contrib.flatpages.sitemaps import FlatPageSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
urlpatterns = [
# ...
# the sitemap
path(
"sitemap.xml",
sitemap,
{"sitemaps": {"flatpages": FlatPageSitemap}},
name="django.contrib.sitemaps.views.sitemap",
),
]
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/contrib/flatpages/