Приложение 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, но если вы используете фреймворк сайтов для управления несколькими сайтами, это может быть идентификатор другого сайта). - Добавьте
'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
Существует несколько способов включения страниц flat в ваш URLconf. Вы можете выделить определённый путь для flat-страниц:
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 без заключительного слеша не будут соответствовать.
Ещё одним распространённым вариантом является использование flat-страниц для ограниченного набора известных страниц и жёсткое кодирование 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 -
Каждый раз, когда любое приложение 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 не попытается отобразить flat-страницу.
Как добавить, изменить и удалить flatpages
Через админскую панель
Если вы активировали автоматическую админскую панель 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 -
Flatpages представлены стандартной моделью Django, которая находится в django/contrib/flatpages/models.py. Вы можете получить доступ к объектам flatpage через Django API базы данных.
Проверка на дубликаты URL flatpage.
Если вы добавляете или изменяете flatpage через свой собственный код, вам, скорее всего, потребуется проверить дубликаты 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 на текущем сайте.
Как и все пользовательские теги шаблонов, вам нужно загрузить его библиотеку пользовательских тегов, прежде чем вы сможете его использовать. После загрузки библиотеки вы можете получить все текущие 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 будет вести себя так же, как если бы вы не предоставляли пользователя – то есть, он будет отображать только публичные страницы.
Ограничение страниц по базовому 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 -
Класс
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/4.2/ref/contrib/flatpages/