Приложение flatpages
Django поставляется с необязательным приложением «flatpages». Оно позволяет хранить «плоское» HTML-содержимое в базе данных и управлять им через админский интерфейс Django и Python-API.
Flatpage — это объект с URL, заголовком и содержимым. Используйте его для одноразовых страниц, таких как «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать специальное приложение Django.
Flatpage может использовать пользовательский шаблон или стандартный шаблон flatpage. Он может быть связан с одним или несколькими сайтами.
Поле «содержимое» можно оставить пустым, если вы предпочитаете разместить содержимое в пользовательском шаблоне.
Установка
Для установки приложения 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 связывает flatpage со сайтом.
Использование URLconf
Существует несколько способов включения страниц flatpages в ваш URLconf. Вы можете выделить определённый путь для flatpages:
urlpatterns = [
path("pages/", include("django.contrib.flatpages.urls")),
]
Вы также можете настроить его как «универсальное» соответствие. В этом случае важно расположить шаблон в конце других urlpatterns:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
re_path(r"^(?P<url>.*/)$", views.flatpage),
]
Предупреждение
Если вы установили APPEND_SLASH на False, вы должны убрать косую черту в универсальном шаблоне, иначе flatpages без косой черты не будут соответствовать.
Ещё один распространённый способ — использовать flatpages для ограниченного набора известных страниц и жестко закодировать URL, чтобы вы могли ссылаться на них с помощью тега шаблона url:
from django.contrib.flatpages import views
urlpatterns += [
path("about-us/", views.flatpage, {"url": "/about-us/"}, name="about"),
path("license/", views.flatpage, {"url": "/license/"}, name="license"),
]
Использование middleware
Класс FlatpageFallbackMiddleware может выполнить всю работу.
-
class FlatpageFallbackMiddleware[source] -
Каждый раз, когда любое приложение Django генерирует ошибку 404, этот middleware проверяет базу данных flatpages в качестве последнего средства для запрошенного URL. В частности, он проверяет наличие flatpage с заданным URL с идентификатором сайта, соответствующим настройке
SITE_ID.Если совпадение найдено, выполняется следующий алгоритм:
- Если у flatpage есть пользовательский шаблон, он загружает этот шаблон. В противном случае загружается шаблон
flatpages/default.html. - Он передаёт этому шаблону единственную переменную контекста,
flatpage, которая является объектом flatpage. Он используетRequestContextдля рендеринга шаблона.
Middleware добавит косую черту в конец и перенаправит (проверяя настройку
APPEND_SLASH), только если полученный URL ссылается на действительный flatpage. Перенаправления являются постоянными (код состояния 301).Если соответствие не найдено, обработка запроса продолжается как обычно.
Middleware активируется только для ошибок 404 — не для 500 или ответов с другим кодом состояния.
- Если у flatpage есть пользовательский шаблон, он загружает этот шаблон. В противном случае загружается шаблон
Flatpages не будут применять middleware представлений
Поскольку FlatpageFallbackMiddleware применяется только после того, как разрешение URL завершилось неудачей и была сгенерирована ошибка 404, возвращаемый им ответ не будет применять методы middleware представлений. Только запросы, успешно перенаправленные на представление через обычное разрешение URL, применяют middleware представлений.
Обратите внимание, что порядок MIDDLEWARE важен. Обычно FlatpageFallbackMiddleware размещают в конце списка. Это означает, что он будет выполняться первым при обработке ответа и гарантирует, что любой другой middleware для обработки ответа увидит реальный ответ flatpage, а не ошибку 404.
Подробнее о middleware см. в документации по middleware.
Убедитесь, что ваш шаблон 404 работает
Обратите внимание, что FlatpageFallbackMiddleware включается только после того, как другое представление успешно сгенерировало ответ 404. Если другое представление или middleware пытаются сгенерировать ошибку 404, но вместо этого возникает исключение, ответ станет HTTP 500 («Внутренняя ошибка сервера»), и FlatpageFallbackMiddleware не будет пытаться предоставить flatpage.
Добавление, изменение и удаление flatpages
Предупреждение
Разрешения на добавление или изменение flatpages следует ограничить для доверенных пользователей. Flatpages определяются набором HTML-кода и не проверяются Django. Вследствие этого вредоносный flatpage может привести к различным уязвимостям безопасности, включая эскалацию привилегий.
Через админский интерфейс
Если вы активировали автоматический админский интерфейс Django, вы должны увидеть раздел «Flatpages» на главной странице администрирования. Редактируйте flatpages, как и любой другой объект в системе.
Модель 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)
Через Python-API
-
class FlatPage[source] -
Flatpages представлены стандартной моделью Django, которая находится в django/contrib/flatpages/models.py. Вы можете получить доступ к объектам flatpage через API базы данных Django.
Проверка на дубликаты URL flatpage.
Если вы добавляете или изменяете flatpages с помощью собственного кода, вам, скорее всего, нужно проверить наличие дубликатов URL flatpage в рамках одного сайта. Форма flatpage в администрировании выполняет эту проверку, и ее можно импортировать из django.contrib.flatpages.forms.FlatpageForm и использовать в собственных представлениях.
Шаблоны flatpage
По умолчанию flatpages рендерятся с помощью шаблона flatpages/default.html, но вы можете переопределить его для конкретного flatpage: в админском интерфейсе в раскрываемом блоке «Дополнительные параметры» (нажатием можно раскрыть блок) есть поле для указания имени шаблона. Если вы создаёте flatpage через Python-API, вы можете установить имя шаблона в поле template_name объекта FlatPage.
Создание шаблона flatpages/default.html — ваша ответственность. В своей папке шаблонов создайте папку flatpages с файлом default.html.
Шаблоны flatpage получают одну переменную контекста, flatpage, которая является объектом flatpage.
Вот пример шаблона flatpages/default.html:
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
Поскольку вы уже вводите необработанный HTML в админскую страницу для flatpage, flatpage.title и flatpage.content помечены как не требующие автоматического экранирования HTML в шаблоне.
Получение списка объектов FlatPage в ваших шаблонах
Приложение flatpages предоставляет тег шаблона, который позволяет итерировать по всем доступным страницам flatpages на текущем сайте.
Как и все пользовательские теги шаблонов, вам необходимо загрузить библиотеку пользовательских тегов перед их использованием. После загрузки библиотеки вы можете получить все текущие 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 flatpages
По умолчанию тег шаблона get_flatpages будет отображать только те flatpages, которые помечены registration_required = False. Если вы хотите отобразить защищенные от регистрации flatpages, вам необходимо указать авторизованного пользователя с помощью предложения for.
Например:
{% get_flatpages for someuser as about_pages %}
Если вы предоставите анонимного пользователя, get_flatpages будет вести себя так же, как если бы вы не предоставили пользователя — то есть он будет отображать только публичные flatpages.
Ограничение flatpages по базовому URL
Необязательный аргумент starts_with может быть применен для ограничения возвращаемых страниц теми, которые начинаются с определенного базового 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[source] -
Класс
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/5.2/ref/contrib/flatpages/