Приложение flatpages
Django поставляется с необязательным приложением «flatpages». Оно позволяет хранить «плоское» HTML-содержимое в базе данных и обрабатывает управление через интерфейс администратора Django и Python-API.
Flatpage — это объект с URL, заголовком и содержимым. Используйте его для отдельных страниц со специальными случаями, таких как страницы «О нас» или «Политика конфиденциальности», которые вы хотите хранить в базе данных, но для которых не хотите разрабатывать собственное Django-приложение.
Flatpage может использовать пользовательский шаблон или системный по умолчанию. Он может быть связан с одним или несколькими сайтами.
Поле содержимого можно оставить пустым, если вы предпочитаете поместить содержимое в пользовательский шаблон.
Установка
Чтобы установить приложение flatpages, выполните следующие действия:
-
Установите приложение
sites framework, добавив'django.contrib.sites'в настройкуINSTALLED_APPS, если она ещё там не есть.Также убедитесь, что вы правильно установили
SITE_IDв ID сайта, который представляет файл настроек. Обычно это1(т.е.SITE_ID = 1, но если вы используете фреймворк сайтов для управления несколькими сайтами, это может быть ID другого сайта). - Добавьте
'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")),
]
Вы также можете настроить его как шаблон «catchall». В этом случае важно разместить шаблон в конце других urlpatterns:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
re_path(r"^(?P<url>.*/)$", views.flatpage),
]
Предупреждение
Если вы установили APPEND_SLASH в False, необходимо удалить слеш в шаблоне catchall, иначе 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 и ID сайта, соответствующим настройке
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 через Django-API для работы с базой данных.
Проверка на дубликаты 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>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
Поскольку вы уже вводите исходный HTML на страницу администратора для flatpage, и flatpage.title, и flatpage.content помечены как не требующие автоматического экранирования HTML в шаблоне.
Получение списка объектов FlatPage в ваших шаблонах
Приложение 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 статических страниц
По умолчанию тег шаблона get_flatpages будет отображать только статические страницы, которые помечены registration_required = False. Если вы хотите отобразить защищенные от регистрации статические страницы, вам необходимо указать авторизованного пользователя с помощью for условия.
Например:
{% get_flatpages for someuser as about_pages %}
Если вы предоставите анонимного пользователя, get_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.1/ref/contrib/flatpages/